我有一個複雜的應用程序,我試圖用MVVM開發(我剛接觸的一種模式) - 應用程序有標籤和停靠窗口,每個窗口都有「選定對象」的概念以及應用程序頂部的全局工具欄,該工具欄上具有需要對「選定對象」執行操作的操作。如果選擇窗格中包含列表視圖,其中選擇的對象是「不活動」,那麼「激活」工具欄MVVM - 作用於「當前選定對象」的全局動作
- :
想象的類似於Visual Studio的東西稍微不太複雜的版本,例如項目應該啓用。 (全局選擇的項目是該列表視圖項目)
- 如果用戶然後單擊另一個窗格中沒有選定對象的選項卡,則應該禁用該相同的工具欄項目(全局選定項目爲空)。
暫時忽略諸如多重選擇之類的複雜性,此刻我通過創建代表「應用程序」本身的包含全部單例模型類來實現這一點,例如,
class MyAppModel : INotifyPropertyChanged
{
public ISelectableObject SelectedObject { get; }
}
然後我有「系統」(我承認我掩飾了很多的細節在這裏)代替確保這個屬性被更新(和培訓相關的活動發射)時,在用戶界面的變化導致在全球「當前選定的對象」的變化,工具欄按鈕使用此屬性來確定可用性等...
但是我越來越掛上事實,這似乎並不像MVVM (我在某處讀取UI狀態應該存儲在ViewModel中?)
- 有一個gl用這種方式代表「應用程序」的obal模型是一個好主意? (還有其他一些屬性,用於以類似的方式跟蹤應用程序中的其他內容,例如打開的文檔)
- 如果不是,我應該使用什麼來代替全局組件(例如工具欄中的項目)找出並跟蹤什麼是「全球選定的對象」是
(*)這可以很容易地使用依賴注入
應用程序的其他部分應該如何獲得這個視圖模型?我的菜單項是作爲獨立的類實現的,它們實現了一個通用接口(例如['ICommand'](http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.aspx)他們如何獲得應用程序ViewModel? – Justin
您的ICommand實現應該是您的主視圖的屬性ModelModel –
這不是真的可能,因爲一些命令是外部定義的,並且在構建菜單時(例如公開菜單選項的插件)在運行時發現。 – Justin