当前位置: 首页 > 编程语言 > C#

两个视图模型之间的通信分享

时间:2023-04-10 22:27:33 C#

两个视图模型之间的通信我是MVVM设计模式的新手,我有这些视图模型:ClassAViewModelpublicclassClassAViewModel:INotifyPropertyChanged{privateint_nbre=0;publicintNbre{get{return_nbre;}设置{_nbre=值;PropertyChanged(这个,新的PropertyChangedEventArgs(“Nbre”));}}#region事件publiceventPropertyChangedEventHandlerPropertyChanged;#endregion}和ClassBViewModelPUBLICViewperifyclassINChangedClassB{privateBoolean_IsBiggerthanFive=false;公共布尔IsBiggerthanFive{得到{返回_IsBiggerthanFive;}设置{_IsBiggerthanFive=值;PropertyChanged(这个,新的PropertyChangedEventArgs(“IsBiggerthanFive”));}}#region事件publiceventPropertyChangedEventHandlerPropertyChanged;#endregion}我需要一种机制来知道两个视图模型之间是否有通知,即在我的情况下,如果第一个视图模型中的_nbre>5,第二个视图模型将被通知_IsBiggerthanFive将更改_IsBiggerthanFive的值。那么:两个视图模型如何在没有另一个视图模型的情况下在它们之间进行通信?完成此任务的最佳方法是什么?我同意其他评论者的观点,即调解器/pub-sub/事件聚合器/messenger是一种很好的方法。如果您没有使用带有内置解决方案的MVVM框架,那么我推荐这种利用Reactive扩展的简单方法:publicIObservableGetEvent(){varsubject=(ISubject)subjects.GetOrAdd(typeof(TEvent),t=>newSubject());返回subject.AsObservable();}publicvoidPublish(TEventsampleEvent){objectsubject;如果(subjects.TryGetValue(typeof(TEvent),outsubject)){((ISubject)subject).OnNext(sampleEvent);}}}这就是您的整个事件聚合器。将它的实例传递到每个视图模型中,并将其存储为引用。然后创建一个类来存储您的事件详细信息,比方说“ValueChangedEvent”:publicclassValueChangedEvent{publicintValue{get{return_value;}}私有只读int_value;publicValueChangedEvent(intvalue){_value=value;}}从第一个视图模型发布如下:set{_nbre=value;PropertyChanged(这个,新的PropertyChangedEventArgs(“Nbre”));_eventPublisher.Publish(新的ValueChangedEvent(值));}使用GetEvent在另一个类中订阅:publicclassClassBViewModel:INotifyPropertyChanged,IDisposable{privatereadonlyIDisposable_subscriber;publicClassBViewModel(IEventPublishereventPublisher){_subscriber=eventPublisher.Subscribe(next=>{IsBiggerthanFive=next.Value>5;});.处置();}}Messenger服务是一种解决方案。MVVMLightToolkit有一个实现。你可以用它做的是在你的视图模型中监听特定类型的消息并通过信使处理它。http://www.mvvmlight.net/以上就是C#学习教程:两个视图模型通信的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: