WPF DataGrid上下文菜单绑定

时间:2014-05-30 13:47:23

标签: c# wpf xaml mvvm wpfdatagrid

我有一个带有DataContext的WPF DataGrid,它绑定到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.Data错误:40:BindingExpression路径错误:'object'上找不到'ContextMenuCommandList'属性''ObservableCollection`1'(HashCode = 53690177)'。 BindingExpression:路径= DataContextProxy.ContextMenuCommandList; DataItem ='BindingProxy'(HashCode = 43857660); target元素是'ContextMenu'(Name =''); target属性是'ItemsSource'(类型'IEnumerable')

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

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

1 个答案:

答案 0 :(得分:0)

你能尝试改变吗? ItemsSource =“{Binding Path = DataContextProxy.ContextMenuCommandList 对此 ItemsSource =“{Binding Path = DataContextProxy / ContextMenuCommandList