Windows和/或UserControls之间通信的模式/方法

时间:2010-07-14 17:54:35

标签: c# wpf windows user-controls

我正在开发一个应用程序,我将使用C#和WPF打开多个窗口。

是否有一种模式或常用方法用于帮助促进开放Windows或/和UserControl之间的通信?

例如,一个窗口,我们称之为“层次结构窗口”,可以显示世界上的国家,省和城市的层次结构。除此之外还有其他几个可能显示省或城市的Windows,例如 OR 允许您创建省或城市。在创建一个新城市的情况下,这是我的“城市之窗”与我的“Hierarachy Window”进行沟通以增加城市或移除城市的最佳方式?

请记住,创建城市时,“层次结构窗口”可能甚至不会打开。此时,不需要回应/行动。

4 个答案:

答案 0 :(得分:1)

有两种常见方法:

  1. 使用依赖注入注入公共服务。
  2. 使用某种形式的信使。
  3. 第二种选择在WPF和Silverlight中变得非常流行。许多常见的工具包,例如MVVM Light(有关详细信息,请参阅Messenger class description),请使用此方法。

答案 1 :(得分:0)

只是添加到里德写的内容:

当我实现这个(在我的情况下使用MVVM)时,我倾向于首先使用Messenger / Mediator模式来启动并运行,然后重构它以使用依赖注入。

有关Mediator模式的一个很好的例子,请看一下名为Cinch (on V2 now I think).的Sasha Barbers MVVM框架。您可以下载所有源代码并查看他如何使用Mediator - 这是一个非常好的例子。您还可以查看Reactive Extensions上用于实现IObservable和IObserver的Microsoft开发实验室项目 - 与您的问题没有直接关系,但这是一种非常酷的消息传递方式。

对于依赖注入,请查看Microsoft Unity Application Bloc k个东西

希望有所帮助。

答案 2 :(得分:0)

您可以查看PRISM框架(在WinForms中曾经是CAB - 复合应用程序块)。它是Microsoft Patterns& amp;的一部分。实践。
 您可以使用事件发布和订阅以非常简单和直接的方式在对象之间进行通信:

//publish:
 eventAggregator.GetEvent<ItemAddedEvent>().Publish(MyItem);

//subscribe:
eventAggregator.GetEvent<ItemAddedEvent>().Subscribe(MyMethod);

我还没有彻底使用它,但它们提供了大量文档和一系列功能来支持DI,命令和验证。值得一试!

答案 3 :(得分:0)

对我来说,这听起来像你需要实现Model-View-Presenter模式。请参阅MVP on MSDN