我在按钮上有一个WPF命令,用于在ListView项目上应用的选项,并且如果所选项目的计数大于零,则可以执行的操作与listview选择有关。
private void DeleteItemCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = SomeListView.SelectedItems.Count > 0;
}
问题是,即使我选择一项或多项,该命令也永远无法执行。我知道我可以使用CommandManager.InvalidateRequerySuggested();
刷新所有命令,但是我不知道它是否可以工作,以及如何在此处执行操作?每1秒?
答案 0 :(得分:0)
您有2种方法可以做到这一点。
第一种方式:为每个命令创建一个新类。
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声明一个新命令
RelayCommand PlusCommand= new RelayCommand(o => DoSomething(), o => true);
答案 1 :(得分:0)
每当CommandManager.InvalidateRequerySuggested()
更改时,您应该调用CanExecuteChanged
或引发命令的SomeListView.SelectedItems.Count
事件。您可以通过处理SelectionChanged
的{{1}}事件来检测何时发生:
ListView