在 IEventAggregator 中重新设置 DelegateCommand 失败?

Posted

技术标签:

【中文标题】在 IEventAggregator 中重新设置 DelegateCommand 失败?【英文标题】:Failed to re-set a DelegateCommand in IEventAggregator? 【发布时间】:2021-06-04 23:47:50 【问题描述】:

假设:

public DelegateCommand Cmd  get; private set; 

public ViewModel(IEventAggregtor ea)

    _ea = ea;

    Cmd = new DelegateCommand(() => Console.WriteLine("old!!"));

    ea.GetEvent<TestEvent>().Subscribe(() => NewingCmd());


private void NewingCmd()

    Cmd = new DelegateCommand(() => Console.WriteLine("new!!"));

预期: 事件发布前,输出“old!!”,发布后也表示NewingCmd,输出“new!!”。

但是在NewingCmd 之前和之后,输出都是“old!!”。

那么我可以在收到发布时更改DelegateCommand 吗?

【问题讨论】:

【参考方案1】:

您没有实现INotifyPropertyChanged,因此在将新的DelegateCommand 分配给Cmd 时,绑定不会收到更改通知并且不会更新。只需从 Prism 的BindableBase 派生,如下所示。请参阅文档中的Implementing INotifyPropertyChanged。

public class ViewModel : BindableBase

   private DelegateCommand _cmd;

   public DelegateCommand Cmd
   
      get => _cmd;
      private set => SetProperty(ref _cmd, value);
   

   public ViewModel(IEventAggregtor ea)
   
      _ea = ea;

      Cmd = new DelegateCommand(() => Console.WriteLine("old!!"));

      ea.GetEvent<TestEvent>().Subscribe(() => NewingCmd());
   

   private void NewingCmd()
   
      Cmd = new DelegateCommand(() => Console.WriteLine("new!!"));
   

【讨论】:

好的,谢谢,这行得通!但这引起了我的困惑:为什么private setter 能够引发属性更改? @Becks723 私有设置器不会引发属性更改,它是SetProperty 方法。查看其源代码here。它首先检查_cmd 的现有值和新值是否相等,如果不相等,则设置新值并引发属性更改方法。 CallerMemberName 属性发生了一些神奇的事情。如果你没有显式传递propertyName,它将被设置为调用者的名字,这里是Cmd @Becks723 这是CallerMemberName文档的链接。 @Becks723 同样,anyone 可以引发PropertyChanged,一个属性的设置器,另一个属性的设置器(通知依赖属性更改)或命令,例如。实际上,仅对于最琐碎的“类固醇字段”属性,setter 是唯一引发事件的人...

以上是关于在 IEventAggregator 中重新设置 DelegateCommand 失败?的主要内容,如果未能解决你的问题,请参考以下文章

导航 - 从区域检索用户输入

Prism:通过事件关闭对话

重新创建父表后如何在 SQLite 中重新设置表 FOREIGN KEY

WORD中重新开始页码如何设置

微信禁止访问隐私数据怎么在设置权限管理中重新授权

如何重新设置电脑中的所有快捷键