WPF - 脱节的控制需要沟通

问题描述:

TLDR版本: 我需要找到一种方式来实现某种“MessageCenter”,其中任何控制可以注册以接收来自其他控件的消息,而不用知道在那里这些消息是从哪里来的(或者它可以知道,只要它不意味着任何额外的工作)。打完整件事后,我想我已经帮助自己实现了我所追求的目标,但如果您能推荐一些预先打包的解决方案,那就太棒了!WPF - 脱节的控制需要沟通


所以,我正在研究这个项目,在这个项目中用户可以做出一些选择和(或多或少)布局一个页面。虽然规则非常严格。在每一步中,他们都可以通过有限数量的方式来改变页面。将其视为模板系统。

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

他们得到复合在一起像这样拉原油: My Terrible Example

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

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

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

我做了一个自定义属性,我可以申请特性,因为它们标记为符合用户改变视图模型,我已经预留一定的空间,动态添加设置的控制。这个想法是,用户一次只能编辑一个项目。当他们选择它时,我将使用反射来检查控件的ViewModel的公共属性,并查找所有标记为editable属性的属性,查看它们的类型,并动态生成控件以编辑它们(当然,绑定)。我们将这称为“SettingsWizard”。

所以这个问题实际上是两个方面:

1:你会如何建议我限制用户一次只能选择一个盒子?很明显,我需要某种应用程序范围的事件或消息。什么形式将采取完全?我将如何注册我的“SettingsWizard”来获取这些消息。我觉得这将是一件非常简单的事情,但我忽略它,因为它感觉不对,或者不干净。

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

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

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

根据你的TLDR段落,我建议看看event aggregator模式。如果你正在寻找一个现有的实现,你可以看看Prism's。我认为棱镜有点过度设计,并且之前发布了simpler implementation