0

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

想象一下类似于 Visual Studio 的稍微简单一点的版本,例如:

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

暂时忽略诸如多项选择之类的复杂情况,目前我通过创建一个代表“应用程序”本身的包罗万象的单例*模型类来实现这一点,例如

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

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

但是,我对这似乎不太像 MVVM 感到困惑(我在某处读到 UI 状态应该存储在 ViewModel 中?)

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

(*) 这可以很容易地使用依赖注入来提供

4

2 回答 2

0

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

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

另请参阅 Inputmanager 类

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

于 2012-06-01T12:26:13.163 回答
0

因为MVVM你肯定应该有一个ViewModel代表你的顶级绑定表面的主控。那个Views主控ViewModel将有一个'SelectedItem'参与INotifyPropertyChanged通知的属性ViewModel。然后,您应该将相关的 ItemsControl(s) (TabControl等)绑定SeledctedItem到此ViewModel属性,然后您的应用程序的其他部分可以绑定到 ViewModelsSelectedItem属性,并且绑定将自动更改。

于 2012-06-01T11:45:15.957 回答