2012-06-01 17 views
0

我有一個複雜的應用程序,我試圖用MVVM開發(我剛接觸的一種模式) - 應用程序有標籤和停靠窗口,每個窗口都有「選定對象」的概念以及應用程序頂部的全局工具欄,該工具欄上具有需要對「選定對象」執行操作的操作。如果選擇窗格中包含列表視圖,其中選擇的對象是「不活動」,那麼「激活」工具欄MVVM - 作用於「當前選定對象」的全局動作

  • 想象的類似於Visual Studio的東西稍微不太複雜的版本,例如項目應該啓用。 (全局選擇的項目是該列表視圖項目)

  • 如果用戶然後單擊另一個窗格中沒有選定對象的選項卡,則應該禁用該相同的工具欄項目(全局選定項目爲空)。

暫時忽略諸如多重選擇之類的複雜性,此刻我通過創建代表「應用程序」本身的包含全部單例模型類來實現這一點,例如,

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

然後我有「系統」(我承認我掩飾了很多的細節在這裏)代替確保這個屬性被更新(和培訓相關的活動發射)時,在用戶界面的變化導致在全球「當前選定的對象」的變化,工具欄按鈕使用此屬性來確定可用性等...

但是我越來越掛上事實,這似乎並不像MVVM (我在某處讀取UI狀態應該存儲在ViewModel中?)

  • 有一個gl用這種方式代表「應用程序」的obal模型是一個好主意? (還有其他一些屬性,用於以類似的方式跟蹤應用程序中的其他內容,例如打開的文檔)
  • 如果不是,我應該使用什麼來代替全局組件(例如工具欄中的項目)找出並跟蹤什麼是「全球選定的對象」是

(*)這可以很容易地使用依賴注入

回答

0

MVVM提供你應該肯定有一個主ViewModel表示您的的頂級綁定表面。該主人ViewModel將擁有'SelectedItem'財產,該財產參與ViewModelINotifyPropertyChanged通知。然後,您應該將相關的ItemsControl(TabControl等)SeledctedItem綁定到此ViewModel屬性,然後您的應用的其他部分可以綁定到ViewModels SelectedItem屬性,綁定將自動更改。

+0

應用程序的其他部分應該如何獲得這個視圖模型?我的菜單項是作爲獨立的類實現的,它們實現了一個通用接口(例如['ICommand'](http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.aspx)他們如何獲得應用程序ViewModel? – Justin

+0

您的ICommand實現應該是您的主視圖的屬性ModelModel –

+0

這不是真的可能,因爲一些命令是外部定義的,並且在構建菜單時(例如公開菜單選項的插件)在運行時發現。 – Justin

0

嘗試註冊Inputmanager.current的PreNotifyInput事件。並將此事件的應用級別註冊到全球級別。

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

也指輸入管理類

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

+0

嗯?我不明白這是如何回答「我應該有一個全局模型代表'應用程序'」 – Justin

相關問題