2011-03-14 46 views
2

我相信我缺少一些簡單的東西(在這個mvvm的東西上仍然有點綠),但我認爲ViewModelLocator的使用移除了對ViewModel的DataTemplate綁定視圖的需求。但由於某種原因,我似乎仍然需要它。ViewModelLocator是否應該刪除DataTemplate的必要性?

在WPF應用程序中,我有一個窗口,其唯一內容是一個內容模板,它綁定到默認綁定。

<Window ... DataContext="{Binding MainView, Source={StaticResource Locator}}"> 
<grid><ContentControl Content="{Binding}"/></grid> 

然後我有一個用戶控件,我猜你可以說是真正的視圖 - viewmodel。

<UserControl ... 
DataContext="{Binding MainView, Source={StaticResource Locator}}"> 
...xaml... 
</UserControl> 

我所注意到的是,除非我把DataTemplate中結合視圖 - 在App.xaml中(在這種情況下的MainView)視圖模型,我剛剛得到的類的名稱。

由於窗口的datacontext使用定位器綁定,所以我認爲這會起作用。我的猜測是,使用ContentControl的窗口中的附加層令人困惑。

如果我用視圖的直接引用替換ContentControl,即。

<view:MainView /> 

這也適用。所以我想我有兩個問題: 1.爲什麼綁定似乎不明白這一點? 2.有沒有辦法讓這個工作使用定位器?我想用最小的UI來創建窗口,並在UserControls中保留批量。

謝謝你的任何信息。

遮擋

回答

1

每個內容的控制可以容納任何對象,如果你只是分配類沒有DataTemplate中,這是在默認情況下轉換爲字符串。 DataTemplate說明應該如何將內容可視化,包括綁定(應該採取和評估對象的屬性)。

ViewModelLocator與DataTemplates沒有任何關係,它只是根據名稱或任何您想要的爲您定位正確的視圖模型。這是如何分離創建/定位視圖模型的邏輯並將其放在一個地方的方式。

+0

謝謝,所以如果我明白我可以跳過window.xaml中的DataContext綁定行並使用App.xaml中的DataTemplate,它將告訴contentcontrol如何顯示。但是我仍然需要爲用戶控件(mainview)提供DataContext綁定。所以,這意味着如果我把一個contentcontrol放在usercontrol(mainview)中並指定另一個view-viewmodel(比如說customerview.xaml),我還需要另一個DataTemplate來綁定這個視圖。 – Obscured 2011-03-14 20:24:03

+0

是的,這是正確的,你設置用戶控件的DataContext,你可以在一個頁面上有多個用戶控件,每個都有自己的ViewModel,當然也有自己的DataTemplate – Robert 2011-03-14 21:32:27

+0

也..在你的例子中,你可以使用:{綁定}抓住父控件綁定。但我通常將usercontrols的datacontext設置爲他們自己的VM,並且這些將在他們自己的XAML中。 – ecathell 2011-05-29 12:36:17