WPF 命令可以执行无响应



我在按钮上有一个 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事件。您可以通过处理ListViewSelectionChanged事件来检测何时发生这种情况:

private void SomeListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
CommandManager.InvalidateRequerySuggested();
}

最新更新