gpt4 book ai didi

c# - 两个 View 模型之间的通信

转载 作者:行者123 更新时间:2023-11-30 12:09:19 25 4
gpt4 key购买 nike

我是 MVVM 设计模式的新手,我有这些 View 模型:

ClassAViewModel

public class ClassAViewModel : INotifyPropertyChanged
{
private int _nbre = 0;

public int Nbre
{
get
{
return _nbre;
}
set
{
_nbre = value;
PropertyChanged(this, new PropertyChangedEventArgs("Nbre"));
}
}

#region Events
public event PropertyChangedEventHandler PropertyChanged;
#endregion

}

ClassBViewModel

 PUBLIC class ClassBViewModel: INotifyPropertyChanged
{
private Boolean _IsBiggerthanFive = false;

public bool IsBiggerthanFive
{
get
{
return _IsBiggerthanFive;
}
set
{
_IsBiggerthanFive = value;
PropertyChanged(this, new PropertyChangedEventArgs("IsBiggerthanFive"));
}
}

#region Events
public event PropertyChangedEventHandler PropertyChanged;
#endregion

}

我需要知道两个 View 模型之间是否存在通知机制,即在我的情况下,如果第一个 View 模型中的 _nbre > 5,第二个 View 模型将被通知并且 的值_IsBiggerthanFive 将被更改。所以:

  1. 两个 View 模型如何在不实例化另一个 View 模型的情况下相互通信?
  2. 完成这项任务的最佳方法是什么?

最佳答案

我同意其他评论者的观点,即调解器/pub-sub/事件聚合器/messenger 是一个不错的选择。如果您不使用带有内置解决方案的 MVVM 框架,那么我推荐 this simple approach that takes advantage of the Reactive extensions :

public class EventPublisher : IEventPublisher
{
private readonly ConcurrentDictionary<Type, object> subjects
= new ConcurrentDictionary<Type, object>();

public IObservable<TEvent> GetEvent<TEvent>()
{
var subject =
(ISubject<TEvent>) subjects.GetOrAdd(typeof (TEvent),
t => new Subject<TEvent>());
return subject.AsObservable();
}

public void Publish<TEvent>(TEvent sampleEvent)
{
object subject;
if (subjects.TryGetValue(typeof(TEvent), out subject))
{
((ISubject<TEvent>)subject)
.OnNext(sampleEvent);
}
}
}

这是您的整个事件聚合器。将它的实例传递到每个 View 模型中,并将其存储为引用。然后创建一个类来存储您的事件详细信息,比方说“ValueChangedEvent”:

public class ValueChangedEvent
{
public int Value
{
get { return _value; }
}
private readonly int _value;

public ValueChangedEvent(int value)
{
_value = value;
}
}

从第一个 View 模型像这样发布:

set
{
_nbre = value;
PropertyChanged(this, new PropertyChangedEventArgs("Nbre"));
_eventPublisher.Publish(new ValueChangedEvent(value));
}

使用GetEvent订阅其他类:

public class ClassBViewModel: INotifyPropertyChanged, IDisposable
{
private readonly IDisposable _subscriber;

public ClassBViewModel(IEventPublisher eventPublisher)
{
_subscriber = eventPublisher.Subscribe<ValueChangedEvent>(next =>
{
IsBiggerthanFive = next.Value > 5;
});
}

public void Dispose()
{
_subscriber.Dispose();
}
}

关于c# - 两个 View 模型之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27452098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com