我的A类是我主窗口的数据上下文。 我有B类,它是应用程序的一个窗口的视图模型。 类之间没有关系。
我需要以某种方式在B类中引发事件,而事件处理程序位于A类中。
是否可以这样做?
我正在做的事情的例子是:我想从B类改变主窗口标题。
感谢您的帮助
答案 0 :(得分:6)
在我的书中,您应该查看pub / sub的messenger / event聚合器。 PRISM附带一个,像MVVM Light工具包这样的东西,或者你可以从Github获取我自己的“drop in cs file” - TinyMessenger。
这允许解耦通信 - 发布者和订阅者共同的唯一事情是聚合器和消息格式本身。如果类是不相关的,并且可能是单独构造的,则不应将它们与事件耦合。如果你确实使用了一个事件,你需要知道订阅一个事件对GC的影响,如果预计这两个类的生命周期不同。
所以,在一个非常简单的例子中,在A类中你会做类似
的事情this.messenger.Subscribe<TitleChangeMessage>(m => <do some stuff>);
然后在B班,每当你要发射“事件”时,你都会这样做:
this.messenger.Publish(new TitleChangedMessage("new title"));
答案 1 :(得分:1)
您只需要将B类中的事件公开,并将A类的委托附加到它。 这是一个例子:B的构造函数启动一个后台任务,等待2秒然后引发事件。 A的构造函数创建一个B类型的对象b,并将其委托附加到b的事件中。在main函数中,创建了一个A类对象,然后该线程进入休眠状态5秒。在此时间过去之前,事件已经被触发并处理。
class A
{
private B b;
public A()
{
b = new B();
b.MyEvent += MyHandler;
}
public void MyHandler(string s)
{
}
public static void Main(string[] args)
{
A a = new A();
Thread.Sleep(5000);
}
}
class B
{
public B()
{
Task.Factory.StartNew(() =>
{
Thread.Sleep(2000);
MyEvent("");
});
}
public delegate void MyDelegate(string s);
public event MyDelegate MyEvent;
}