在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中。 但实际上并非如此。我怎么知道名字的路径?
答案 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应用程序的更多信息:)