2010-07-19 25 views
1

我在Silverlight中有一個相當簡單的問題,我想用MVVM原理解決它,主要是作爲一種方式提高我自己的理解。多個「兄弟」控件,一次一個可見,MVVM

比方說,我有一個簡單的LOB應用程序,旨在讓我加載和編輯單個員工(僅作爲示例,爲了便於說明)。在我的示例中,員工由許多複雜對象組成 - 員工具有ContactInfo,Skillset,EmploymentHistory,AwardsEarned等等。想法是,我可以讓這個應用加載單個員工並訪問許多不同的編輯器屏幕。員工的每個組件都有其自己的編輯器屏幕。

在視覺上,應用程序只是左側的導航欄和右側的主視圖。導航欄只讓我輸入一個員工編號,並將其作爲「活躍」員工加載到內存中。它有一個簡單的鏈接列表 - 單擊一個鏈接應該在右側加載適當的編輯器屏幕。

有一些概念,我認爲我的理解不夠好,而且我遇到了麻煩。我知道永遠有不止一種方式來對一隻貓進行皮膚處理,特別是當涉及到WPF/Silverlight/XAML/MVVM時,但我在思考所有不同的概念和它們的反響時遇到困難。

查看優先或視圖模型首先

經過一番思考MVVM,看起來最自然的我是視圖模型組合物的約什 - 史密斯似乎在他經常引用的文章promote概念。這裏的想法似乎是,您通過將視圖模型組合在一起來逐字地建模您的UI,然後讓視圖模型通過類型化的DataTemplates呈現自己。這感覺就像是我非常好的關注點,它也使得視圖模型的溝通非常直接和易於理解。

當然,對於許多投訴,Silverlight在DataTemplates上沒有DataType屬性:one,two。無論如何,我所看到的比視圖模型組合更經常推廣的是更多視圖優先設計,其中視圖的視圖模型通常在視圖的XAML中或通過DI容器實例化,這意味着您無法將其任何參數傳遞給它。我很難理解這一點:如果我永遠無法告訴它模型中的數據,ViewModel應該如何爲模型提供視圖服務?通過觀點來達到它的視角模型似乎也沒有意義。我在這方面很朦朧,但似乎接受的答案是「使用中介/輕量級消息框架」。我現在只是在MVVMLight的消息傳遞系統上查看一些教程,我會研究類似的東西,如果只是爲了理解這些概念而已,但如果任何人都可以對此有所瞭解,我會非常欣賞它。任何涉及統一/棱鏡或MEF是有效的,但我還沒有得到那麼遠,我求知尚未:-)

實例化視圖,並選擇他們

理論上(我這樣說是因爲沒有按SL不支持DataTemplate DataType),視圖模型組合方法可以使這非常簡單。我可以讓屏幕的右側是內容控件,其內容屬性綁定到名爲ActiveEditor的屬性。超鏈接的參數化命令會將ActiveEditor設置爲給定的視圖模型。

用更多的觀點優先的方法,我將如何繼續這個?首先想到的是實例化主視圖的XAML中的所有控件。

操縱ContentControl的Content屬性是一種很好的方法去處理這種情況,還是我最好做一些事情,比如設置每個單獨控件的可見性?

回答

1

ViewModel(VM)的編寫方式使其與模型「連線」,但對所有視圖都不知情 - 事實上,這對於單元測試(see NUnit)非常有用,因爲它不知道,它更少關心它是否被UI或測試框架使用。

VM展示了實現ICommand接口的公共CLR屬性,View實例化了一個虛擬機(一般來說是它的默認構造函數),然後將它的Buttons/Hyperlinks等綁定到這些Command屬性。因此,舉例來說,你可以有一個虛擬機,它公開CloseCommand退出應用程序,查看可能包含一個菜單項結合該命令,如:

<MenuItem Header="E_xit" Command="{Binding Path=CloseCommand}" /> 

現在,虛擬機也將公開公共要在UI中顯示的對象的ObservableCollection。無論您是將此ObservableCollection作爲VM構造函數的一部分填充,還是通過UI交互(例如分配給Button的另一個Command),都取決於您,但最終結果是您將View控件綁定到此公開的ObservableCollection在XAML像:

<y:DataGrid ItemsSource="{Binding Breakdown}"/> 

或equivelant不管什麼控制你使用的顯示數據(不知道把我的頭頂部一個DataGrid在Silverlight中什麼元素,而不是WPF)。

與此同時...:Mediator模式用於VM彼此交互,而不是View與VM交互。例如,您可能有一個自定義的TreeView,它在與主圖表屏幕相同的View上具有自己的VM。在這種情況下,您可以使用Mediator作爲TreeView的虛擬機與圖表虛擬機進行通信。

至於你的問題的最後一點,我想在你提到的文章中使用Josh Smith的方式設置一個基本框架,並使用該方法在Silverlight應用程序的右側添加其他ViewModels。

希望至少有所幫助。