2013-04-08 50 views
1

我的工作是由以下几个部分的应用的领域:视图模型到视图模型通信

  • 资源管理器 - 包含一个TreeView
  • PropertyInspector - 包含PropertyGrid的
  • 编辑器 - 包含一个资源管理器和一个PropertyInspector

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

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

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

+0

搜索RelayCommand实现, 比您在执行命令的发布商一个虚拟机,并在订阅者执行它。 我稍后会发布一个真正的实现。仅供参考,您的粗犷逻辑毫无兴趣尝试从技术角度解决问题 – 2013-04-08 19:43:49

回答

0

我强烈推荐使用MVVM框架。我有类似的要求,并决定采用Tony Sneed's Simple MVVM Toolkit。它非常轻巧,记录非常详细,易于理解,提供了非常有用的功能,并且基本上确实为您提供了MVVM管道。

你在这种情况下,需要的是利用消息总线的特点:

MessageBus

有时你需要通过视图模型中的消息在应用程序中一个很好的例子当你想根据一些商业逻辑导航到一个特定的视图时,直接从另一个视图模型引用主视图模型并不是一个好主意,这样做会在视图模型之间产生相互依赖关系,这将会很困难维持(一种现象称为意大利面代码),这是一个消息总线(也称为事件我分配器或聚合器)派上用场。例如,CustomerViewModel可以使用特定的令牌向消息总线发送消息,并且当有人使用相同的令牌向消息总线发送消息时,MainPageViewModel可以订阅接收消息。消息令牌只是可以在类中定义为常量的字符串。From the Programming Reference page

除此之外我还用Josh Smith's RelayCommand简化ICommand通知作为@eran otzap建议

0

编辑VM应协调两个孩子的VM。

添加所选项目物业资源管理器VM (如果它不存在)并确保它触发财产变更通知

属性检查器VM应该有一个类似的属性,它是要显示属性的项目。

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

这里没有必要涉及到消息总线。消息总线用于松散耦合的ViewModel以将消息传递给对方。例如应用程序范围通知文件已被打开。

如果你在这里使用了一个消息总线,那么任何重用的虚拟机也会触发消息,这不是你想要的。