C# WPF:MenuItem.CommandParameter绑定设置为null

C# WPF:MenuItem.CommandParameter绑定设置为null,c#,wpf,mvvm,binding,menuitem,C#,Wpf,Mvvm,Binding,Menuitem,我为我的数据网格定义了以下ContextMenu: <igDP:XamDataGrid.ContextMenu> <ContextMenu ItemsSource="{Binding CommandViewModels}" > <ContextMenu.ItemContainerStyle> <Style TargetType="MenuItem">

我为我的数据网格定义了以下ContextMenu:

<igDP:XamDataGrid.ContextMenu>
    <ContextMenu ItemsSource="{Binding CommandViewModels}"                     >
        <ContextMenu.ItemContainerStyle>
            <Style TargetType="MenuItem">
                <Setter Property="Command" Value="{Binding Command}" />
                <Setter Property="CommandParameter" Value="{Binding CommandParameter}" />
                <Setter Property="Header" Value="{Binding Name}" />
                <Setter Property="Icon" Value="{Binding Icon}" />
            </Style>
        </ContextMenu.ItemContainerStyle>
    </ContextMenu>
</igDP:XamDataGrid.ContextMenu>
当我右键单击网格中的一行时,ContextMenu的每个MenuItem的样式都是正确的。菜单项的图标、标签和命令与预期一致。但是,应作为参数传递给绑定到MenuItem.command的RelayCommand的命令参数CommandViewModel.CommandParameter为空

我相当确定可用于绑定的命令参数不是null。这是运行在.NET4.0上的WPF应用程序


有人经历过这个吗

这显然是CommandParameter绑定的一个已知问题

因为我不想编辑Prism代码,所以我最终使用了引用的CodePlex文章中定义的类

修改自定义RelayCommand类以实现IDelegateCommand,如下所示:

 public class RelayCommand : IDelegateCommand
{
    readonly protected Predicate<object> _canExecute;
    readonly protected Action<object> _execute;      

    public RelayCommand(Predicate<object> canExecute, Action<object> execute)
    {
        _canExecute = canExecute;
        _execute = execute;          
    }

    public void RaiseCanExecuteChanged()
    {
        if (CanExecuteChanged != null)
            CanExecuteChanged(this, EventArgs.Empty);
    }      

    public virtual bool CanExecute(object parameter)
    {
        return _canExecute(parameter);
    }

    public event EventHandler CanExecuteChanged;

    public virtual void Execute(object parameter)
    {
        _execute(parameter);
    }      
}
公共类RelayCommand:IDelegateCommand
{
只读受保护谓词_canExecute;
只读受保护的操作\u执行;
公共RelayCommand(谓词canExecute、操作execute)
{
_canExecute=canExecute;
_执行=执行;
}
public void raisecancecutechanged()
{
如果(CanExecuteChanged!=null)
CanExecuteChanged(此为EventArgs.Empty);
}      
公共虚拟布尔CanExecute(对象参数)
{
返回_canExecute(参数);
}
公共事件处理程序CanExecuteChanged;
公共虚拟空执行(对象参数)
{
_执行(参数);
}      
}
并修改我的原始样式以使用CommandParameterBehavior,如下所示:

 <Style TargetType="MenuItem">
                <Setter Property="Command" Value="{Binding Command}" />
                <Setter Property="CommandParameter" Value="{Binding CommandParameter}" />
                <Setter Property="Header" Value="{Binding Name}" />
                <Setter Property="Icon" Value="{Binding Icon}" />
                <Setter Property="utility:CommandParameterBehavior.IsCommandRequeriedOnChange" Value="true"
            </Style>


你有多确定,你调试代码了吗?我刚刚试过你的代码,参数通过了。。。是否您的ICommand实现缺少接收参数的功能?@Tico,我分配给CommandParameter的值不是null。另外,如果修改CommandParameter以便在其getter中放置断点,则框架检索的值不为null。@emedbo,我以前也在树状视图上使用过同样的代码,所以可能这是XamDataGrid的一个特殊之处。即使尝试以编程方式创建MenuItems,传递给RelayCommand的CanExecute的命令参数仍然为空。非常有趣的问题。
 <Style TargetType="MenuItem">
                <Setter Property="Command" Value="{Binding Command}" />
                <Setter Property="CommandParameter" Value="{Binding CommandParameter}" />
                <Setter Property="Header" Value="{Binding Name}" />
                <Setter Property="Icon" Value="{Binding Icon}" />
                <Setter Property="utility:CommandParameterBehavior.IsCommandRequeriedOnChange" Value="true"
            </Style>