c# - 在ViewModelBase中调用CommandManager.InvalidateRequerySuggested吗?

标签 c# wpf mvvm inotifypropertychanged relaycommand

最初的问题:
我在MVVM应用程序中使用典型的RelayCommand实现。
我意识到,即使ViewModel的有意义的属性发生了变化,我的CanExecuteRelayCommand也不会始终被调用。

我读到我们可以手动调用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/

相关文章:

c# - 无需装饰器的反序列化

c# - NuGet 与类 w/EF6 实体的直接引用

wpf - 从 View 模型中单击按钮调用第二个 View

c# - 如何获得多个数组的所有组合?

c# - 无法在asp.net core 2.0 Web App中实现功能文件夹

c# - 使用 Awesomium 从 YouTube API 在 C# 中捕获 JavaScript 事件

wpf - MahApps.Metro 更改 ToggleSwitch 样式

c# - 在哪里提出 NotifyPropertyChanged?

c# - MVVM应用程序中的工具箱设计

c# - 将 contextMenu 绑定(bind)到与 TreeView 不同的 View 模型