2013-03-26 73 views
0

我是MVMM Light工具包(注意,我在.NET 3.5上使用Light)的新手。到目前爲止,我真的開始喜歡這種模式,以應對兩個挑戰。MVVM Light多個數據上下文

  • 我想爲我的應用程序中某些類型的頁面使用可重用的XAML模板。想想電影票亭。在中心的主要內容,但幾乎總是一個按鈕在屏幕上的某個地方取消或返回。我想要有可重用的網格,當我創建一個新頁面時,我基本上導入了這個網格佈局,不必擔心常見的部分,只能關注我的部分。做一點研究,我覺得像<ContentPresenter>可能是去這裏的路,但它對我來說仍然是陌生的。

  • Assumign我成功地接受了第一個挑戰,我會認爲這些常見項目的數據上下文(比如說一個Cancel按鈕)會在該頁面的ViewModel之外的其他位置,以避免大量代碼重複。這是採取個別控制並引用XAML中不同視圖模型的最佳方法嗎?喜歡的東西...

    <Button ... DataContext={Binding CommonStuffVM, Source={StaticResource Locator}} />

+0

爲有這麼多的脫節視圖的應用程序有點問題相切 - 網頁瓦特/導航服務(導航UI隱藏)是走對了路? – Ternary 2013-03-26 13:06:46

回答

1

您可以使用TemplatesDataTemplates創建定義對象應該是什麼樣子的可重複使用的模板。

例如,

<DataTemplate DataType="{x:Type local:MovieTicket}"> 
    <!-- Write the XAML for your Movie Ticket --> 
</DataTemplate> 

你可以給你的DataTemplate一個x:Key專門引用它在ItemTemplateContentTemplate,或離開它,所以它會被用來隨時WPF試圖繪製MovieTicket對象

<ItemsControl ItemsSource="{Binding MovieTickets}" /> 

<ContentControl Content="{Binding SelectedMovieTicket}" /> 

關於第二個問題,我認爲這將是對個體的控制是一個壞主意,但其對節目的完整部分的通行做法。

當使用MVVM,你ViewModels是應用程序,而不是你的UI。

如果窗口應用戶編輯顯示Movies列表,並且允許用戶保存或取消他們的變化,那麼你的視圖模型應包含ObservableCollection<Movie>和包含ICommand SaveCommandICommand CancelCommand

你真的想您的視圖僅反映您的ViewModel,並且不讓他們從ViewModel層次結構中提取他們需要的數據。

根據你的問題,你可能有興趣在博客文章中,我有關於Navigation with MVVM它使用的代碼非常相似,你問什麼。它演示瞭如何使用隱式的DataTemplates來更改UI,並且包含一個完整的代碼示例,您可以下載並查看以更好地瞭解MVVM體系結構。

+0

感謝您的有用鏈接。 ICommand的東西很有意義。我仍然不確定如何讓DataTemplate以我想要的方式工作。因此,「全局」某處我可以定義一個帶有一些按鈕的網格,然後在每個視圖中,我可以「導入」該網格並向其添加控件?這就是我要去的。 – Ternary 2013-03-26 20:08:59

+0

@Ternary'DataTemplates'通常在應用程序的「Resources」中找到,可以隱式或顯式應用。你可以給它們一個'x:Key'並在需要時給它們指定名稱(''),或者你可以關閉'x:Key'並給它們一個'DataType'屬性,並且它們將在WPF嘗試繪製指定數據類型的對象時自動使用,例如我在答案中的內容。 – Rachel 2013-03-27 12:00:12

+0

非常感謝我的信息和耐心。我在我的'App.xaml'資源中創建了模板,它工作正常。兩個挑戰 - 我的模板引用了'Skin.xaml'中的靜態資源樣式(Mvvm light給了我這個起點),並且這些綁定無法解析。現在我只是將它們移到我的App.xaml中(我有炸魚)。但是,網格元素(比如背景顏色)在使用時需要綁定到不同的樣式。是否有一種方法讓修改它所呈現模板的綁定? – Ternary 2013-03-27 13:22:52