WPF DataGrid and DataGridTemplateColumn Header Problems
本文关键字:Header Problems DataGridTemplateColumn and DataGrid WPF | 更新日期: 2023-09-27 18:35:21
我在一段代码中遇到了问题...
我有如下内容:
<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 类型派生的视图中 -- 绝对可以肯定。 由于某种原因,绑定在模板列标题中的复选框上失败。 不寻常的是,我在其他视图中有此代码 - 它工作绝对正常,没有任何问题。 我总是先创建 ViewModel,然后将其作为参数传递给 View,其中 DataContext 在构造时设置为 ViewModel,即
View(ViewModel myViewModel)
{
InitializeComponent();
DataContext = myViewModel;
}
ViewModel 上有 AreAllSelected 属性,但我收到以下错误 - 所以我知道它由于某种原因没有找到祖先。
System.Windows.Data 错误:4:找不到要绑定的源 参考资料 '相对来源 发现祖先, AncestorType='System.Windows.Controls.UserControl', 祖先级别='1''。BindingExpression:Path=DataContext.AreAllSelected; 数据项=空;目标元素是"复选框"(名称=");目标属性 为"已检查"(类型"可为空"1")
奇怪的是,即使它不起作用,当我使用 Snoop 查看它时,它最初也不会起作用。 当我查看绑定并深入研究它时,绑定现在可以工作了。
我想知道这是如何在可视化树级别构建的奇怪问题还是什么? 正如我之前所说 - 我已经在其他视图中做了几次,它们工作正常。 一定是我做错了什么奇怪的事情......
尝试相反的方法:
View(ViewModel myViewModel)
{
DataContext = myViewModel;
InitializeComponent();
}
顺便说一句,你应该使用标题模板来模板标题。标头本身只能是例如字符串值。
您放置了复选框。这不是 wpf 中的通常方式。