【发布时间】:2013-02-10 12:41:18
【问题描述】:
我在 WPF MVVM 应用程序中使用 Josh Smith RelayCommand 类在 ViewModel 中创建命令:
例如:
ICommand RemoveAllCommand = new RelayCommand<object>(OnRemoveAll, CanRemoveAll);
我从 ContextMenu 调用此命令:
<ContextMenu x:Key="MyContextMenu" DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Remove All" Command="{Binding Path=DataContext.RemoveAllCommand,
RelativeSource={RelativeSource AncestorType={x:Type TreeView}}}" CommandParameter="{Binding Path=.Header}" />
一切正常,除了我的 MenuItem 仍然可见但已禁用,我想将 Visibility 设置为 Collapsed,以便当 Relay Command 中的 CanExecute 返回 false 时,我的 MenuItem 不会显示。
我尝试设置与 Visibility 属性的绑定,但我不知道如何使用参数绑定到我的 CanRemoveAll(object obj) 方法。我也想过使用 DataTrigger,但我不知道该怎么做。
这是我在 ViewModel 中的 CanRemoveAll 方法:
public bool CanRemoveAll(object param)
{
GoldTreeNodeViewModel gtn = param as GoldTreeNodeViewModel;
return (gtn != null && gtn.Children != null && gtn.Children.Count > 0);
}
来自 RelayCommand 类:
public event EventHandler CanExecuteChanged
{
add
{
if (_canExecute != null)
CommandManager.RequerySuggested += value;
}
remove
{
if (_canExecute != null)
CommandManager.RequerySuggested -= value;
}
}
[DebuggerStepThrough]
public Boolean CanExecute(Object parameter)
{
return _canExecute == null ? true : _canExecute((T) parameter);
}
任何帮助将不胜感激,
【问题讨论】:
-
能否请您在 VM 中显示 CanRemoveAll 的代码以及从哪里引发 CanExecuteChanged。
-
刚刚将该信息添加到问题中。我也没有在任何地方明确提出
CanExecuteChanged,我认为RelayCommand和WPF 内部负责处理这一点,据我所知。
标签: wpf contextmenu relaycommand