我对一段代码有疑问...
我有如下内容:
<DataGrid AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
ItemsSource="{Binding Path=RowData,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
RowHeaderWidth="0">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<CheckBox IsChecked="{Binding RelativeSource={RelativeSource Findancestor, AncestorType={x:Type UserControl}},Path=DataContext.AreAllSelected}">
Select All
</CheckBox>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=IsSelected,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGrid.Columns>
</DataGrid>
它位于派生自 UserControl 类型的 View 中——这是绝对肯定的。由于某种原因,TemplateColumn Header 中的 CheckBox 绑定失败。不同寻常的是,我在其他视图中有这段代码——它工作得非常好,没有任何问题。我总是先创建 ViewModel,并将其作为参数传递给 View,其中 DataContext 在构造时设置为 ViewModel,即
View(ViewModel myViewModel)
{
InitializeComponent();
DataContext = myViewModel;
}
ViewModel 上有 AreAllSelected 属性,但我收到以下错误 - 所以我知道它由于某种原因没有找到祖先。
System.Windows.Data 错误:4:找不到与引用“RelativeSource FindAncestor,AncestorType='System.Windows.Controls.UserControl',AncestorLevel='1''的绑定源。BindingExpression:Path=DataContext.AreAllSelected; 数据项=空;目标元素是'CheckBox'(名称='');目标属性是“IsChecked”(类型“Nullable`1”)
奇怪的是,即使它不起作用,当我使用 Snoop 来查看它时,它最初也不起作用。当我查看 Binding 并深入研究它时,Binding 现在可以工作了。
我想知道它是如何在可视树级别构建的,或者是什么奇怪的问题?正如我之前所说——我已经在其他视图中多次这样做了,它们工作正常。一定有一些奇怪的事情我做错了......