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 查看它时,它最初也不会起作用。 当我查看绑定并深入研究它时,绑定现在可以工作了。

我想知道这是如何在可视化树级别构建的奇怪问题还是什么? 正如我之前所说 - 我已经在其他视图中做了几次,它们工作正常。 一定是我做错了什么奇怪的事情......

WPF DataGrid and DataGridTemplateColumn Header Problems

尝试相反的方法:

View(ViewModel myViewModel)
{
   DataContext = myViewModel;
   InitializeComponent();
}

顺便说一句,你应该使用标题模板来模板标题。标头本身只能是例如字符串值。

您放置了复选框。这不是 wpf 中的通常方式。