WPF - 脱节控制需要沟通

时间:2010-11-14 05:00:04

标签: wpf events communication messaging

TLDR版本: 我需要找到一种方法来实现某种“MessageCenter”,其中任何控件都可以注册以接收来自其他控件的消息,而不知道这些消息来自何处(或者它可以知道,只要它不代表任何额外的为我工作)。在输入这一切之后,我想我已经帮助自己实现了我所追求的目标,但如果你能推荐一些预先打包的解决方案,那就太棒了!


所以,我正在开发这个项目,用户可以在这个项目中进行一些选择和(或多或少)布局页面。但规则非常严格。在每一步中,他们都可以通过有限的方式更改页面。把它想象成一个模板系统。

有很多接口: ITemplate,IContentArea和ISpecificControl 每个模板都有一些内容区域。每个ContentArea都有三个特定的控件。

他们将这些原始图纸合成在一起: My Terrible Example

大光紫色盒子是模板。 黄色,粉色和棕色框是IContentArea的不同具体类型。 绿色,浅蓝色和深紫色框是不同的具体类型的ISpecificControl。

这些接口的每个具体实现都有一些我希望用户能够设置的公共属性。

例如: 绿色框可能允许您设置字体大小和字体颜色。 浅蓝色框可能允许您设置背景颜色。 深紫色框可能允许您设置图像大小和边距。 黄色,粉色和棕色框允许您选择要使用的三个特定控件。 大紫色框可让您选择内容区域的布局方式(有些区域可能只有两个或三个,也许它们排列在对角线上)。

我已经创建了一个自定义属性,我可以将其应用于ViewModel中的属性,这些属性标记它们符合用户更改的条件,并且我已经预留了一些空间来动态添加设置控件。这个想法是用户一次只能编辑一个项目。当他们选择它时,我将使用反射来检查控件的ViewModel的公共属性,找到所有使用editable属性标记的属性,查看它们的类型,并动态生成控件来编辑它们(当然还有绑定) )。我们称之为“设置向导”。

所以问题实际上是双重的:

1st:您如何建议我将用户限制为一次只选择一个SINGLE框?显然,我需要某种应用程序范围的事件或消息传递。究竟采取什么形式?我将如何注册我的“设置向导”以获取这些消息。我觉得这将是一件非常简单的事情,但我忽略了它,因为它感觉不对或干净。

任何让其中一个控件发出一条消息的消息说:“嘿,我是最后一个被点击的人。如果有其他人被选中,现在你不是,”会解决问题,所以只要接收控件不必知道消息来自何处。

我在想某种静态的“MessageCenter”,当创建每个控件时,它会使用定义的接口注册为传递消息(在它的构造函数中),并且任何控件都能够向MessageCenter发送消息,然后将它传递给它。那个听起来是对的吗?我觉得这种性质已经存在。就像Prism中的功能一样(但我并不需要任何其他功能)。

第二名:我如何让我的“设置向导”知道他有一个新项目需要显示设置?据推测,第一项的解决方案也可用于解决这一问题。这只是一种不同的通知。

1 个答案:

答案 0 :(得分:0)

根据您的TLDR段落,我建议您查看event aggregator模式。如果您正在寻找现有的实施方案,可以查看Prism's。我认为Prism有点过度设计,以前发过simpler implementation