最初的问题:
我在MVVM应用程序中使用典型的RelayCommand
实现。
我意识到,即使ViewModel的有意义的属性发生了变化,我的CanExecute
的RelayCommand
也不会始终被调用。
我读到我们可以手动调用CommandManager.InvalidateRequerySuggested
引发RequerySuggested
事件。最终,这将使Command Source调用CanExecute
方法。
发生某些UI事件时,RequerySuggested
自动引发CommandManager
。我觉得如果在PropertyChanged
上也提出它会很有用。
我当前的解决方案:
我修改了ViewModelBase
类的属性更改方法,如下所示:
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
Application.Current.Dispatcher?.Invoke(CommandManager.InvalidateRequerySuggested);
}
问题:
我还没有找到以这种方式在线实现的
ViewModelBase
,我觉得这应该是一个危险信号。在MVVM中,强烈建议使用
RelayCommand
,因为它很简单,所以我觉得很奇怪,最终不得不手动调用CommandManager。那为什么不喜欢DelegateCommand
呢?我知道这会导致
CanExecute
的调用频率更高,但是无论如何,每次UI事件发生时,它已经被发送垃圾邮件。
最佳答案
“典型”中继命令?
如果使用的是MVVMLight的relaycommand,则源为:
https://github.com/lbugnion/mvvmlight/blob/master/GalaSoft.MvvmLight/GalaSoft.MvvmLight%20(PCL)/Command/RelayCommand.cs
您可以在中继命令上调用CanExecutechanged。
将using语句添加到任何 View 模型时,请确保使用CommandWPF版本。
发生用户输入事件时,将调用InvalidateRequerySuggested。因此,当用户输入任何内容并且更改了您更改了属性的属性时,您将引发两次。意味着您的方法是一个坏主意。
很少有数据逐个属性地从模型到 View 模型。通常会引发一个事件,然后 View 模型将来自 View 模型的数据组成属性。在获得新记录或变更事件后,您可能只需提高一次即可执行一次更改,但是当数据更改不是由用户输入驱动时,便会发生更改。
关于c# - 在ViewModelBase中调用CommandManager.InvalidateRequerySuggested吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57828807/