【发布时间】:2014-07-20 07:18:21
【问题描述】:
我有一个 WPF DataGrid,其 DataContext 绑定到一个可观察的视图模型集合。
我的 DataGrid 列每个都绑定到集合中对象的不同属性,这可以正常工作,在网格上显示集合中的对象。
我想在这个网格上添加一个上下文菜单,菜单项定义为视图模型上的另一个属性,构成了整个可观察集合。这些菜单项是菜单项的另一个 Observable 集合。我知道这种方法可以工作,因为我在应用程序的另一部分的树视图上有类似的代码。
我已经定义了DataGrid和ContextMenu的绑定如下:
<DataGrid Name="SynchErrors" Grid.Row="1"
Style="{StaticResource SortableGrid}"
ItemsSource="{Binding}">
<DataGrid.Resources>
<userControls:BindingProxy x:Key="BindingProxy" DataContextProxy="{Binding}" />
</DataGrid.Resources>
<DataGrid.ContextMenu>
<ContextMenu DataContext="{Binding Path=DataContextProxy, Mode=TwoWay, Source={StaticResource BindingProxy}}"
ItemsSource="{Binding Path=DataContextProxy.ContextMenuCommandList, Mode=TwoWay, Source={StaticResource BindingProxy}}">
<ContextMenu.Resources>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding ContextMenuCommand}"></Setter>
<Setter Property="Header" Value="{Binding DisplayName}"></Setter>
</Style>
</ContextMenu.Resources>
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.Columns>
<DataGridTextColumn Header="From"
MinWidth="120"
Width="*"
Binding="{Binding Path=Owner}"/>
<DataGridTextColumn Header="Subject"
Width="2*"
Binding="{Binding Path=Name}"
SortMemberPath="Name"/>
<DataGrid.Columns>
当我运行我的应用程序时,我的项目在网格中正确列出,但是当我右键单击时,我得到一个空的上下文菜单和以下绑定错误:
System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“ObservableCollection`1”(HashCode=53690177)上找不到“ContextMenuCommandList”属性。 BindingExpression:路径=DataContextProxy.ContextMenuCommandList; DataItem='BindingProxy' (HashCode=43857660);目标元素是'ContextMenu'(名称='');目标属性是“ItemsSource”(类型“IEnumerable”)
我已使用 BindingProxy 将 DataContext 从 DataGrid 传递到 ContextMenu,因为上下文菜单位于可视树之外,但这似乎是传递整个集合而不是绑定到每一行的单个项目。
是否可以在 DataGrid 上定义上下文菜单的绑定以引用父集合的每个单独项?
【问题讨论】:
标签: c# wpf xaml mvvm wpfdatagrid