使用 MVVM 上下文菜单项命令绑定 WPF

Gur*_*ruC 6 data-binding wpf command contextmenu mvvm

我知道这个问题已经在许多网站和 StackOverFlow 中以不同的方式被问过很多次,但我找到的所有答案都没有帮助我,准确地说,我无法理解它们并在我的应用程序中实现。所以我想从我的应用程序中添加一些代码,以便你们可以更好地帮助我。

问题陈述:我正在使用 WPF DataGrid。我添加了一个上下文菜单,有 3 个选项“剪切”、“复制”、“粘贴”。我正在使用 MVVM 进行开发。我想将这些选项数据绑定到我的 ViewModel 中的命令。但我却无法做到同样的事情。上下文菜单选项根本没有绑定数据!

这是我的 XAML 网格代码:

<custom:DataGrid  
      x:Name="DataGrid_Standard"   
      Grid.Row="1" Grid.Column="1"   
      AutoGenerateColumns="False"                                                           
      IsSynchronizedWithCurrentItem="True"   
      Background="Transparent"
      ItemsSource="{Binding FullGridData}" 
      ItemContainerStyle="{StaticResource defaultRowStyle}"
      ColumnHeaderStyle="{StaticResource DefaultColumnHeaderStyle}"                         
      Grid.ColumnSpan="2">
Run Code Online (Sandbox Code Playgroud)

然后我有一个 ContextMenu 和一个标题元素的样式

<ContextMenu x:Key="columnHeaderMenu">
   <MenuItem Command="{Binding CutCommand}"
             Header="Test" />
   <MenuItem Header="Copy"/>
   <MenuItem Header="Paste"/>
</ContextMenu>
<Style TargetType="{x:Type custom:DataGridColumnHeader}" x:Key="DefaultColumnHeaderStyle">
    <Setter Property="ContextMenu" Value="{DynamicResource columnHeaderMenu}" >
</Style>
Run Code Online (Sandbox Code Playgroud)

这行代码出现在我的构造函数中

public Window1()
{            
   this.DataContext = new AppData();
}
Run Code Online (Sandbox Code Playgroud)

此代码位于我的 AppData 类中:

public class AppData  
{ 
    private IList<GridData> fullGridData = new ObservableCollection<GridData>();<br> 
    public IList<GridData> FullGridData
    {
        get { return fullGridData; }
        set { fullGridData = value; }
    }

    private DelegateCommand<object> cutCommand;
    public DelegateCommand<object> CutCommand
    {
        get
        {
            if (cutCommand == null)
            {
                cutCommand = new DelegateCommand<object>(CutColumn);
            }
            return cutCommand;
        }
    }

    private void CutColumn(object obj)
    {
        //some code goes here
    }   
}
Run Code Online (Sandbox Code Playgroud)

** 我想知道我到底哪里做错了?为什么数据绑定没有发生?请帮助我解决这个问题。请向我提供示例代码或对我当前代码的修改,我可以从中实现它。**

Zam*_*oni -1

你有两个选择。
注意:我在此处添加的代码示例与您的示例类似,但不相同。

将 ContextMenu 的定义移至 DataGrid 定义内,如下所示:

<WpfToolkit:DataGrid
   x:Name="DataGrid_Standard"
   IsSynchronizedWithCurrentItem="True"
   Background="Transparent" 
   ItemsSource="{Binding FullGridData}" 
   ColumnHeaderStyle="{StaticResource DefaultColumnHeaderStyle}">
   <WpfToolkit:DataGrid.ContextMenu>
       <ContextMenu>
           <MenuItem Command="{Binding CutCommand}" Header="Test" />
           <MenuItem Header="Copy"/>
           <MenuItem Header="Paste"/>
       </ContextMenu>
   </WpfToolkit:DataGrid.ContextMenu>
</WpfToolkit:DataGrid>
Run Code Online (Sandbox Code Playgroud)

或者更好地向您的资源添加 CommandReference 并将 MenuItem 中的 Command 设置为 StaticResource,如下所示:

<Window.Resources>
    <c:CommandReference x:Key="MyCutCommandReference" Command="{Binding CutCommand}" />

    <ContextMenu x:Key="columnHeaderMenu">
        <MenuItem Command="{StaticResource MyCutCommandReference}" Header="Test" />
        <MenuItem Header="Copy"/>
        <MenuItem Header="Paste"/>
    </ContextMenu>

    <Style TargetType="{x:Type Primitives:DataGridColumnHeader}" x:Key="DefaultColumnHeaderStyle">
        <Setter Property="ContextMenu" Value="{DynamicResource columnHeaderMenu}" />
    </Style>

</Window.Resources>

<WpfToolkit:DataGrid
   x:Name="DataGrid_Standard"
   IsSynchronizedWithCurrentItem="True"
   Background="Transparent" 
   ItemsSource="{Binding FullGridData}" 
   ColumnHeaderStyle="{StaticResource DefaultColumnHeaderStyle}"/>
Run Code Online (Sandbox Code Playgroud)