我有一个可行的解决方案,但我相信有更好的方法来写这个。
我有一个带有数据网格的用户控件。数据网格的ItemsSource
设置为{Binding Path=MyView}
,其中MyView
是视图模型的ICollectionView
属性。用户控件的数据上下文设置为视图模型。
在数据网格中,我有一个复选框标题。我想将复选框的IsChecked
状态绑定到视图模型中的属性。
这是我到目前为止所做的,它似乎有效,但我担心这种绑定是不必要的复杂。 UI是非常基本的,所以我希望绑定比它更直接。
有没有更好的方式来表达这种约束力?
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Views:MyUserControlClass}}, Path=DataContext.AllRowsSelected}" />
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
答案 0 :(得分:2)
在这种情况下我使用
ElementName=userControl
而不是
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Views:MyUserControlClass}}
您也可以使用
{Binding Parent.DataContext.AllRowsSelected, ElementName=LayoutRoot}
在这种情况下,我假设 LayoutRoot 是父级是用户控件的元素的名称。 Parent
是它的财产。因此绑定设置为父级的DataContext属性。
我更喜欢最后一个变体,因为为用户控件提供名称会限制其使用。
修改
关于 LayoutRoot 。此名称通常是为Window或UserControl中的top元素提供的,或者只是为某些布局提供:
<Window ...>
<Grid Name="LayoutRoot">
...
</Grid>
</Window>
这个名字没什么特别的。经常使用。与xaml:sys中的命名空间别名(指向mscorlib),本地(指向应用程序命名空间)等情况相同。