我在按钮上有一个 WPF 命令,用于应用于 ListView 项的选项,如果所选项计数大于零,则"可以执行"操作与列表视图选择相关。
private void DeleteItemCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = SomeListView.SelectedItems.Count > 0;
}
问题是,即使我选择一个或多个项目,该命令也永远不会执行。我知道我可以用CommandManager.InvalidateRequerySuggested();
刷新所有命令,但我不知道它是否有效,以及如何在这里做?每 1 秒 ?
您有两种方法可以做到这一点。
第一种方法:为每个命令创建一个新类。
public class PlusCommand : ICommand
{
private YourViewModelClass viewModel;
public PlusCommand(YourViewModelClass vm)
{
viewModel = vm;
}
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
//Your code to run here. Access viewmodel by viewModel variable.
}
public event EventHandler CanExecuteChanged;
}
第二种方法:创建一个 RelayCommand 类,并将 RelayCommand 类用于将来的每个命令。
第 1 步:创建 RelayCommand 类。
public class RelayCommand : ICommand
{
private Action<object> execute;
private Func<object, bool> canExecute;
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
{
this.execute = execute;
this.canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return this.canExecute == null || this.canExecute(parameter);
}
public void Execute(object parameter)
{
this.execute(parameter);
}
}
步骤 2:通过中继命令声明新命令
RelayCommand PlusCommand= new RelayCommand(o => DoSomething(), o => true);
您可以在此处阅读更多内容。
每当SomeListView.SelectedItems.Count
更改时,都应调用CommandManager.InvalidateRequerySuggested()
或引发命令的CanExecuteChanged
事件。您可以通过处理ListView
的SelectionChanged
事件来检测何时发生这种情况:
private void SomeListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
CommandManager.InvalidateRequerySuggested();
}