Проблемы с привязкой в ​​DataTrigger - PullRequest
0 голосов
/ 10 мая 2011

В статье Джоша Смита "Приложения WPF с шаблоном проектирования Model-View-ViewModel"

В коде из AllCustomersView.xaml:

  <DataTrigger Binding="{Binding Path=Name}" Value="True">
      <Setter TargetName="txt" Property="Text" Value="Company" />
  </DataTrigger>

Я не мог узнать, где находится недвижимость - Имя.Я думал, что это было в CustomerViewModel.cs.Но на самом деле это не так.Как я мог узнать путь Имени?

Ответы [ 3 ]

2 голосов
/ 10 мая 2011

Это происходит из CollectionViewSource:

<CollectionViewSource
  x:Key="CustomerGroups" 
  Source="{Binding Path=AllCustomers}">
  <CollectionViewSource.GroupDescriptions>
    <PropertyGroupDescription PropertyName="IsCompany" />
  </CollectionViewSource.GroupDescriptions>
  <CollectionViewSource.SortDescriptions>
    <scm:SortDescription PropertyName="IsCompany" Direction="Descending" />
    <scm:SortDescription PropertyName="DisplayName" Direction="Ascending" />
  </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

Когда вы используете CVS, он берет ваши данные (в данном случае набор экземпляров CustomerViewModel) и разбивает их на группы (в данном случае на основе свойства IsCompany).

Каждая группа помещается в CollectionViewGroup . Коллекция этих групп затем привязывается к элементу управления, который будет отображать группы. Таким образом, свойство Name фактически найдено в CollectionViewGroup и является значением IsCompany (это PropertyGroupDescription) или строковым значением логического значения.

Если вы измените привязку на что-то недопустимое

<DataTrigger Binding="{Binding Path=Derp}" Value="True">
    <Setter TargetName="txt" Property="Text" Value="Companies" />
</DataTrigger>

вы увидите, что он перестает работать, и в вашем окне вывода появится следующее сообщение:

System.Windows.Data Ошибка: 39: Ошибка пути BindingExpression: 'Derp' свойство не найдено на «объекте» '' CollectionViewGroupInternal (HashCode = 41413147). BindingExpression: Path = Derp; DataItem = ' CollectionViewGroupInternal (HashCode = 41413147); целевой элемент 'ContentPresenter' (Name = ''); цель свойство «Нет цели» (тип «Объект»)

CollectionViewGroupInternal является внутренней реализацией CollectionViewGroup , которую CollectionViewSource использует для группировки вашей коллекции по свойству IsCompany

0 голосов
/ 10 мая 2011
<DataTrigger Binding="{Binding Path=Name}" Value="True">
  <Setter TargetName="txt" Property="Text" Value="Company" />
</DataTrigger>

потому что ваш DataTrigger является частью группового стиля, а ваш групповой стиль используется для вашего списка, а ваш список данных представляет собой коллекционный источник с описанием группы -> Binding Path = Name предназначен для свойств MS.Internal.Data.CollectionViewGroupInternal

, чтобы вы могли получить доступ ко всем свойствам из CollectionViewGroup

кстати, вы можете использовать Snoop , чтобы узнать больше о вашем приложении wpf:)

0 голосов
/ 10 мая 2011

В сеттере есть TargetName = "txt", который является именем

      <TextBlock 
        x:Name="txt" 
        Background="{StaticResource Brush_HeaderBackground}"
        FontWeight="Bold"
        Foreground="White"
        Margin="1"
        Padding="4,2,0,2"
        Text="People" 
        />

Таким образом, этот путь привязки установлен для этого свойства элемента управления. Имя

...