我的一段代码存在问题......
我有如下内容:
<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>
它是在一个View中,它是从UserControl类型派生出来的 - 绝对可以肯定。由于某种原因,绑定在TemplateColumn标头中的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:路径= DataContext.AreAllSelected; 的DataItem = NULL; target元素是'CheckBox'(Name ='');目标财产 是'IsChecked'(类型'Nullable`1')
奇怪的是,即使它不起作用,当我使用Snoop查看它时,它最初也不起作用。当我查看Binding并深入研究它时,Binding现在可以正常工作。
我想知道它是如何在Visual Tree级别构建的或者是什么?正如我之前所说 - 我在其他视图中已经完成了其他几次,并且它们工作正常。必须有一些奇怪的事情,我做错了......
答案 0 :(得分:3)
尝试相反的方式:
View(ViewModel myViewModel)
{
DataContext = myViewModel;
InitializeComponent();
}
顺便说一句,你应该使用HeaderTemplate模板标题。单独的标题只能是一个字符串值。
您放置了CheckBox。这不是wpf的通常方式。