我正在使用Caliburn Micro为我的应用程序创建Visual Studio样式界面。
用户可能在多个窗口中出现多个错误,这些错误都显示在“错误”视图中,该视图停靠在应用程序的底部。我已经设法实现了一个很好的通知机制,以便在对任何文档进行更改时,会通知错误VM并查询源对象。
但是,我在弄清楚如何双击导航到错误源时遇到了麻烦。
想象一下,我已将“描述”绑定到文档视图上的文本框中,这提供了“描述是必需的”验证消息。双击该消息应该将用户导航到相关文档并专注于文本框。
提供消息的验证对象已经包含对viewmodel的引用(作为IViewAware
接口),这允许我调用GetView()
来获取对视图的引用。我已经尝试使用这种方法枚举我的视图上的绑定,并找到绑定到特定属性的控件,虽然这非常慢,而且更多的是暴力 - 运气方法
有没有人对此问题的方法有任何建议?我唯一的另一个想法是将“焦点”操作的责任传递给视图本身,并决定如何处理导航到某个属性的请求 - 可能使用附加属性通过唯一属性标识符来标识特定控件。应用程序可以将此列表缓存在字典中以使事情更快(所有处理都在应用程序加载时预先完成)
我认为Visual Studio很容易为标准代码编辑器窗口实现这一点,因为它只需要一个行号来跳转到正确的位置。
答案 0 :(得分:0)
好的,所以经过几个小时弄乱了这个我已经找到了一个似乎工作正常的解决方案。我为我的视图实现了一个接口类,允许它们导航。
基本设置是:
ErrorsViewModel
- 接收业务对象需要重新查询错误的通知,并管理错误列表以及何时需要查询(以便可以在后台线程上完成任何工作以防止锁定UI)< / p>
WorkspaceViewModel
- 托管工具窗格和文档的主工作区VM
ICanNavigate
- 视图将决定如何处理导航参数的界面
NavigationEventMessage
- 发送给事件聚合器以提供导航通知和参数的消息
ErrorsViewModel
通过事件聚合器从另一个VM接收事件消息,并最终查询该对象(如果可以)。收集错误后,它会显示视图中的项目(此时在网格控件中)。
当用户双击一行时,将调度NavigationEventMessage
,其中包含一些参数,例如调度它的视图和目标业务对象等。它由...处理。
1)WorkspaceViewModels视图。这允许它通过查看每个对象的DataContext并检查它是否与消息中传递的视图匹配来使正确的文档激活
2)目标文档视图,视图根据消息中发送的参数决定要突出显示/显示/搜索的内容
这似乎是将VM与View分离的最合理方式,因为ViewModels仍然没有与视图耦合。视图只是实现了接口,如果它在那里,则VM调用它并传入args。