DataTrigger中的绑定问题

时间:2011-05-10 12:57:29

标签: wpf mvvm binding datatrigger

在Josh Smith的文章中,"WPF Apps With The Model-View-ViewModel Design Pattern"

来自AllCustomersView.xaml的代码:

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

我无法找到属性 - 名称的位置。 我以为它在CustomerViewModel.cs中。 但实际上并非如此。我怎么知道名字的路径?

3 个答案:

答案 0 :(得分:2)

它来自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:路径= DERP;   的DataItem = '的 CollectionViewGroupInternal '   (的HashCode = 41413147);目标元素是   'ContentPresenter'(Name ='');目标   属性是'NoTarget'(类型'对象')

CollectionViewGroupInternal CollectionViewGroup 的内部实现,CollectionViewSource用于将您的集合分组到属性 IsCompany

答案 1 :(得分:0)

在setter中有一个TargetName =“txt”,其名称为

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

因此,此绑定路径设置为此控件属性名称

答案 2 :(得分:0)

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

因为您的DataTrigger是groupstyle的一部分,您的groupstyle用于listview,而listview datacontext是一个带有groupdescription的collectionviewsource - &gt; Binding Path = Name的目标是MS.Internal.Data.CollectionViewGroupInternal

的属性

因此您可以访问CollectionViewGroup

中的所有媒体资源

顺便说一句,您可以使用Snoop了解有关您的wpf应用程序的更多信息:)