在 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 失败?的主要内容,如果未能解决你的问题,请参考以下文章