0

我正在使用 Caliburn Micro 为我的应用程序创建一个 Visual Studio 风格的界面。

用户可能在多个窗口中出现多个错误,这些错误都显示在停靠在我的应用程序底部的“错误”视图中。我已经设法实现了一个很好的通知机制,以便在对任何文档进行更改时,通知错误 VM 并查询源对象。

但是,我在弄清楚如何双击以导航到错误源时遇到了麻烦。

想象一下,我已将“描述”绑定到文档视图上的文本框,这提供了“需要描述”验证消息。双击消息应该将用户导航到有问题的文档并关注文本框。

提供消息的验证对象已经包含对视图模型的引用(作为IViewAware接口),它允许我调用GetView()以获取对视图的引用。我已经尝试使用这种方法来枚举我的视图上的绑定并找到绑定到特定属性的控件,尽管这非常慢并且更多的是蛮力 - 运气好方法

有人对解决此问题的方法有任何建议吗?我唯一的另一个想法是将“焦点”操作的责任传递给视图本身,并决定如何处理导航到某个属性的请求 - 可能使用附加属性通过唯一属性标识符来识别特定控件。应用程序可以将此列表缓存在字典中以加快处理速度(在加载应用程序时预先完成所有处理)

我假设 Visual Studio 很容易为标准代码编辑器窗口实现这一点,因为它只需要一个行号就可以跳转到正确的位置。

4

1 回答 1

0

好的,所以在搞砸了几个小时后,我找到了一个似乎可以正常工作的解决方案。我已经为我的视图实现了一个接口类,它允许它们导航。

基本设置是:

ErrorsViewModel- 接收业务对象需要重新查询错误的通知,并管理错误列表以及何时需要查询(以便可以在后台线程上完成任何工作以防止锁定 UI)

WorkspaceViewModel- 托管工具窗格和文档的主工作区 VM

ICanNavigate- 视图将用于决定如何处理导航参数的接口

NavigationEventMessage- 发送到事件聚合器以提供导航通知和参数的消息

通过ErrorsViewModel事件聚合器从另一个 VM 接收事件消息并最终查询对象(如果可以)。收集错误后,它会在视图中显示项目(目前在网格控件中)。

当用户双击一行时,aNavigationEventMessage被调度,其中包含一些参数,例如调度它的视图和目标业务对象等。它由..

1) WorkspaceViewModels 视图。这允许它通过查看每个对象的 DataContext 并检查它是否与消息中传递的视图匹配来激活正确的文档

2) 目标文档视图,视图根据消息中发送的参数决定突出显示/显示/查找的内容

这似乎是将 VM 与视图分离的最合乎逻辑的方式,因为 ViewModel 仍然与视图没有耦合。视图只是实现了接口,如果它在那里,VM 会调用它并传入参数。

于 2012-11-27T09:16:39.580 回答