不相关的类之间的事件

时间:2011-07-09 08:45:53

标签: c# wpf events

我的A类是我主窗口的数据上下文。 我有B类,它是应用程序的一个窗口的视图模型。 类之间没有关系。

我需要以某种方式在B类中引发事件,而事件处理程序位于A类中。

是否可以这样做?

我正在做的事情的例子是:我想从B类改变主窗口标题。

感谢您的帮助

2 个答案:

答案 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;
    }