WPF DatGrid上下文菜单绑定

本文关键字:绑定 菜单 上下文 DatGrid WPF | 更新日期: 2023-09-27 18:05:50

我有一个WPF DataGrid与DataContext绑定到视图模型的Observable集合。

我的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。数据错误:40:BindingExpression路径错误:'ContextMenuCommandList'属性未在'对象'' 'ObservableCollection ' 1' (HashCode=53690177)'上找到。BindingExpression:路径= DataContextProxy.ContextMenuCommandList;DataItem = ' BindingProxy ' (HashCode = 43857660);目标元素是'ContextMenu' (Name= ");目标属性为"ItemsSource"(类型为"IEnumerable")

我已经使用BindingProxy将DataContext从DataGrid传递到ContextMenu,因为上下文菜单在Visual Tree之外,但是这似乎传递了整个集合,而不是绑定到每行的单个项目。

是否有可能在DataGrid上定义上下文菜单的绑定以引用父集合的每个单独项?

WPF DatGrid上下文菜单绑定

你能试着改变一下吗= DataContextProxy ItemsSource = "{绑定路径。ContextMenuCommandList这个ItemsSource = "{绑定路径= DataContextProxy/ContextMenuCommandList