4

我对一段代码有疑问...

我有如下内容:

<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 现在可以工作了。

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

4

1 回答 1

3

换一种方式试试:

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

顺便说一句,您应该使用 HeaderTemplate 模板化标题。单独的标头只能是例如一个字符串值。

您放置了 CheckBox。这不是 wpf 中的常用方式。

于 2013-10-14T16:32:52.110 回答