1

我正在研究由以下部分组成的应用程序区域:

  • Explorer - 包含一个 TreeView
  • PropertyInspector - 包含一个 PropertyGrid
  • Editor - 包含一个 Explorer 和一个 PropertyInspector

如您所见,这些部分以分层方式组织。我的问题是:如何使资源管理器使用的树视图中的选定项目成为属性检查器使用的属性网格的选定对象?

当树视图引发 SelectedItemChanged 事件时,会向 ExplorerViewModel 发送一条命令。PropertyGrids SelectedObject 绑定到 PropertyInspectorViewModel 上的属性。如何连接两个视图模型?一种方法可能是让 EditorViewModel 将 PropertyInspectorViewModel 上的方法附加到 ExplorerViewModel 在收到命令时引发的事件,但这是要走的路还是可以通过数据绑定以某种方式解决?

编辑器不直接使用树视图和属性网格的原因是因为资源管理器和属性检查器,连同所有撤消/重做功能、验证代码等,旨在在其他领域重用。

4

2 回答 2

0

我强烈推荐使用 MVVM 框架。我有类似的要求并决定采用Tony Sneed 的 Simple MVVM Toolkit。它非常轻量级,文档齐全且易于理解,提供了非常有用的功能,并且基本上为您完成了 MVVM 管道的必备功能。

在这种情况下,您需要使用消息总线功能:

"消息总线

有时您需要在应用程序的视图模型之间传递消息。一个很好的例子是当您想要基于某些业务逻辑导航到特定视图时。直接从另一个视图模型引用主视图模型不是一个好主意。这样做会在难以维护的视图模型之间产生相互依赖关系(这种现象称为意大利面条代码)。这就是消息总线(也称为事件调解器或聚合器)派上用场的地方。例如,CustomerViewModel 然后可以使用特定令牌将消息发送到消息总线,并且 MainPageViewModel 可以订阅以接收消息,只要有人将具有相同令牌的消息发送到消息总线。消息标记只是可以定义为类中的常量的字符串。"从编程参考页面

除此之外,我还使用Josh Smith'sRelayCommand来简化ICommand通知,正如@eran otzap 所建议的那样

于 2013-04-08T19:48:23.347 回答
0

编辑器 VM 应协调两个子 VM。

将选定的项目属性添加到资源管理器 VM(如果它不存在)并确保它触发属性更改通知。

属性检查器 VM 应该具有类似的属性,即要显示其属性的项目。

然后,编辑器观察资源管理器 VM 的选定项属性的更改,并在更改时将新项传递给属性检查器 VM。

这里不需要涉及消息总线。消息总线适用于松散耦合的 ViewModel 以相互传递消息。例如,文件已打开的应用程序范围通知。

如果您在此处使用消息总线,那么任何对 VM 的重用也会触发消息,这不是您想要的。

于 2013-04-09T16:02:23.920 回答