MVVM - 作用于“当前所选对象”的全局操作

时间:2012-06-01 11:37:06

标签: c# wpf user-interface mvvm

我有一个复杂的应用程序,我试图使用MVVM(我不熟悉的模式)开发 - 应用程序有标签和停靠窗口,每个窗口都有“选定对象”的概念,以及全局工具栏在应用程序的顶部,对其执行操作,需要对“选定对象”执行操作。

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

  • 如果选择的窗格包含所选对象为“非活动”的列表视图,则应启用“激活”工具栏项。 (全局选定项目是列表视图项目)
  • 但是,如果用户单击另一个没有选定对象的窗格中的选项卡,则应禁用相同的工具栏项(全局选定项为空)。

暂时忽略多项选择等复杂问题,目前我通过创建一个代表“应用程序”本身的无所不包的单例*模型类来实现这一点,例如

class MyAppModel : INotifyPropertyChanged
{
    public ISelectableObject SelectedObject { get; }
}

然后,我有“系统”(我承认我在这里掩盖了很多细节),以确保在UI中的更改导致更改时更新此属性(并触发相关事件)全局“当前选定的对象”,工具栏按钮使用此属性来确定可用性等...

但是我对这个看起来不像MVVM的事实感到困惑(我在某处看到UI状态应该存储在ViewModel中?)

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

(*)可以使用依赖注入轻松提供

2 个答案:

答案 0 :(得分:0)

MVVM你绝对应该拥有一个代表ViewModel顶级绑定表面的主Views。主人ViewModel会有一个'SelectedItem'参与INotifyPropertyChanged的{​​{1}}通知的属性。然后,您应该将相关的ItemsControl(ViewModel等)TabControl绑定到此SeledctedItem属性,然后您的应用的其他部分可以绑定到ViewModels ViewModel属性,绑定将自动更改。

答案 1 :(得分:0)

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

InputManager.Current.PreNotifyInput += new NotifyInputEventHandler(Current_PreNotifyInput);

也指Inputmanager类

http://msdn.microsoft.com/en-us/library/ms617136