2010-03-09 26 views
5

我可以設置視圖模型之間的關係,並查看通過以下DataContext語法:WPF中的DataTemplate和DataContext有什麼區別?

<UserControl.DataContext> 
    <view_model:MainMenuModel /> 
</UserControl.DataContext> 

而且我還可以設置視圖模型之間的關係,並查看通過以下DataTemplate語法:

<DataTemplate 
     DataType="{x:Type viewModel:UserViewModel}"> 
     <view:UserView /> 
    </DataTemplate> 

是什麼兩者的區別?第二個XAML沒有設置視圖的數據上下文嗎?

回答

8

您的第二個XAML定義了一個模板,可用於顯示viewModel:UserViewModel類型的對象。它不會爲任何內容設置數據,但如果要求ContentPresenter顯示該類型的對象,它將使用您的模板。

您的第一個XAML正在設置您的控件的DataContext屬性。它定義您在該範圍內執行的任何綁定都將使用DataContext作爲綁定的根(除非明確覆蓋)。在工作中的DataContext一個簡單的例子,比較這兩種(均爲假設「S」是System命名空間):

<StackPanel> 
    <TextBlock Text="{Binding Day, Source={x:Static s:DateTime.Now}}" /> 
    <TextBlock Text="{Binding Month, Source={x:Static s:DateTime.Now}}" /> 
    <TextBlock Text="{Binding Year, Source={x:Static s:DateTime.Now}}" /> 
</StackPanel> 

<StackPanel DataContext="{Binding Source={x:Static s:DateTime.Now}}"> 
    <TextBlock Text="{Binding Day}" /> 
    <TextBlock Text="{Binding Month}" /> 
    <TextBlock Text="{Binding Year}" /> 
</StackPanel> 

兩個StackPanels將呈現相同的,但第二個更容易重用。 (例如:如果你想顯示不同的日期,你只需要在一個地方更改裝訂。)

+0

嗨,彼得,本感謝大家的回覆。 我想知道是否可以將控件的datacontext和datatemplate設置爲相同的視圖模型? –

+0

@Ashish:你可以將DataContext設置爲ViewModel本身,但是你可以將DataTemplate設置爲*顯示* ViewModel的模板 - 而不是視圖模型本身。 –

2

FrameworkElementDataContext是元素綁定的內容。它基本上是object。在MVVM模式中,這通常是ViewModel對象,但不一定是。這只是您想要應用於該FrameworkElement的一些上下文信息。它本身並不直接影響視覺表現。

當WPF想要顯示一些沒有自己的可視化表示的對象時(例如不是從UIElement下降的,它會查看是否存在相應的DataTemplate來定義它應該如何呈現該數據。例如,您曾經說過,UserViewModel類應該使用UserView控制呈現,但是你有沒有實際創建無論是UserViewModelUserView

這兩個概念經常一起去。例如,假設你有一個ObservableCollection<object>其中有其中一個Foo和一個Bar對象。您可以定義不同的對於FooBar,爲3210秒。然後,您可以將您的收藏夾綁定到ItemsControl。控件中的每個對象都會根據其類型中的相應DataTemplate獲得可視化表示。

另一個簡單的例子:如果你有一個名爲DisplayObject對您的視圖模型的屬性,你只是希望它出現與您所定義的任何DataTemplate,您可以使用ContentPresenter控制:

<ContentPresenter DataContext="{Binding DisplayObject}"/> 

同樣,這個結果在WPF中查找類型的正確模板並使用它來構造表示。

相關問題