【发布时间】:2018-04-03 11:28:39
【问题描述】:
我在从 Style 中访问特定 DataContext 时遇到了一些问题。
我有一个这样定义的DataGrid:
<DataGrid Name="ReferenceDataGrid" ItemsSource="{Binding Items}" AutoGenerateColumns="False" RowHeaderWidth="0" IsReadOnly="True">
<DataGrid.Resources>
<Style TargetType="DataGridRow">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Delete" Command="???" />
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</DataGrid.Resources>
...
包含此DataGrid 的Page 的DataContext 属性设置为
DataContext="{Binding RelativeSource={RelativeSource Self}}"
我想将RelayCommand 绑定到MenuItem 并尝试了几种不同的方法来做到这一点:
Command="{Binding DeleteCommand}"-
Command="{Binding ElementName=Root, Path=DeleteCommand}"// 页面元素名称设置为 Root Command="{Binding ElementName=Root, Path=DataContext.DeleteCommand}"Command="{Binding Path=DataContext.DeleteCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}"
我在DeleteCommand 的命令处理程序中设置了一个断点,但上述变体都没有到达那里。
假设Items 包含Foo 类型的元素。
如果我在Foo 中定义命令,则处理程序会被触发,因此似乎无论我在上面做了什么,每个DataGridRow 的DataContext 似乎都是列表元素本身。
知道该怎么做吗?
编辑:
我还尝试将DataContext 提取到一个单独的类中并引用它而不是Relative Self,因为我认为列表元素可能使用Relative Self 作为它们的DataContext,而不是它所引用的Page 实例。可惜我错了。
【问题讨论】:
-
不,也不起作用。也许我必须做一些不同的事情,因为我使用的是样式而不是数据模板?
-
您是否只会使用与 DataGrid 在同一数据上下文中的命令?
-
@Andy 到目前为止,我总是每个页面/窗口等只有一个 DataContext。我真的不想用这些东西弄乱模型类,所以我将它们存储在页面的 DataContext 中。我还需要更新 DataContext 中的其他几个属性,因此将其部分提取到单独的属性中不会带来任何好处
-
其实……这是件好事。我会发布一个解决方案。