gpt4 book ai didi

c# - WPF : MenuItem. 命令参数绑定(bind)设置为空

转载 作者:太空狗 更新时间:2023-10-29 23:39:11 32 4
gpt4 key购买 nike

我为我的数据网格定义了以下上下文菜单:

<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>

CommandViewModel类定义如下:

public class CommandViewModel : ICommandViewModel
{
public CommandViewModel(string name, Image icon, ICommand command, object commandParameter = null, int index = 0)
{
Name = name;
Icon = icon;
Command = command;
CommandParameter = commandParameter;
Index = index;
}

public string Name { get; set; }
public Image Icon { get; set; }
public ICommand Command { get; set; }
public object CommandParameter { get; set; }
public int Index { get; set; }
}

当我右键单击网格中的一行时,ContextMenu 的每个 MenuItem 的样式都正确。 MenuItem 的图标、标签和命令符合预期。但是,应作为参数传递给绑定(bind)到 MenuItem.Command 的 RelayCommand 的命令参数 CommandViewModel.CommandParameter 为空。

我相当确定可用于绑定(bind)的命令参数不为空。这是在 .NET 4.0 上运行的 WPF 应用程序。

有人遇到过吗?

最佳答案

这显然是 CommandParameter 绑定(bind)的一个已知问题。

因为我不想编辑 Prism 代码,所以我最终使用了 CommandParameterBehavior在引用的 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);
}
}

并修改我的原始样式以使用 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>

CommandParameter 现在已正确传递。

关于c# - WPF : MenuItem. 命令参数绑定(bind)设置为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20670870/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com