C# MVVM-作用于;“当前选定对象”;

C# MVVM-作用于;“当前选定对象”;,c#,wpf,user-interface,mvvm,C#,Wpf,User Interface,Mvvm,我有一个复杂的应用程序,我正试图使用MVVM(我是新来的一种模式)开发该应用程序-该应用程序有选项卡和停靠窗口,每个选项卡和窗口都有“选定对象”的概念,并且在应用程序顶部有一个全局工具栏,其中的操作需要对“选定对象”进行操作 想象一下类似Visual Studio的稍不复杂的版本,例如: 如果选择了包含列表视图的窗格,其中所选对象处于“非活动”状态,则应启用“激活”工具栏项。(全局选定项是该列表视图项) 但是,如果用户单击另一个窗格中没有选定对象的选项卡,则应禁用该工具栏项(全局选定项为空)

我有一个复杂的应用程序,我正试图使用MVVM(我是新来的一种模式)开发该应用程序-该应用程序有选项卡和停靠窗口,每个选项卡和窗口都有“选定对象”的概念,并且在应用程序顶部有一个全局工具栏,其中的操作需要对“选定对象”进行操作

想象一下类似Visual Studio的稍不复杂的版本,例如:

  • 如果选择了包含列表视图的窗格,其中所选对象处于“非活动”状态,则应启用“激活”工具栏项。(全局选定项是该列表视图项)
  • 但是,如果用户单击另一个窗格中没有选定对象的选项卡,则应禁用该工具栏项(全局选定项为空)
暂时不考虑复杂的情况,例如多个选择,目前我已经通过创建一个代表“应用程序”本身的包罗万象的singleton*模型类实现了这一点,例如

class MyAppModel : INotifyPropertyChanged
{
    public ISelectableObject SelectedObject { get; }
}
然后,我有一个“系统”(我承认我在这里忽略了很多细节),以确保当UI中的更改导致全局“当前选定对象”中的更改时,该属性被更新(并触发相关事件),工具栏按钮使用该属性来确定可用性等

然而,我被这样一个事实挂住了:这看起来不太像MVVM(我在某个地方读到UI状态应该存储在ViewModel中?)

  • 有一个以这种方式表示“应用程序”的全局模型是一个好主意吗?(上面还有其他属性,用于以类似方式跟踪应用程序中的其他内容,例如打开的文档)
  • 如果没有,我应该使用什么来代替全局组件(如工具栏中的项目)来查找并跟踪“全局选定对象”是什么


(*)对于
MVVM
,使用依赖项注入同样可以轻松提供。您应该明确拥有一个主
ViewModel
,它代表您的
视图的顶级绑定面。该主
ViewModel
将具有一个参与
INotifyPropertyChanged
视图模型的通知。然后,您应该将相关项控件(
TabControl
etc)
SeledctedItem
绑定到此
ViewModel
属性,然后应用程序的其他部分可以绑定到ViewModels
SelectedItem
属性,绑定将自动更改。

尝试注册Inputmanager.current的PreNotifyInput事件。并在应用程序级别将此事件注册到全局级别

InputManager.Current.PreNotifyInput += new NotifyInputEventHandler(Current_PreNotifyInput);
另请参阅Inputmanager类


嗯?我不明白这是如何回答“我应该有一个表示‘应用程序’的全局模型吗?”这个问题的。应用程序的其他部分应该如何获得这个ViewModel?我的菜单项作为实现公共接口的独立类实现(例如,界面-它们是如何获得应用程序视图模型的?您的ICommand实现应该是主视图模型上的属性,这实际上是不可能的,因为某些命令是在外部定义的,并且在构建菜单时在运行时发现的(例如,公开菜单选项的插件)。在MVVM中,您的菜单应绑定到您的viewmodel,并且您的viewmodel应计算并显示构建菜单所需的容器