2010-03-09 12 views
5

kann ich die Beziehung zwischen View Modell gesetzt und Blick durch folgende DataContext Syntax:Was ist der Unterschied zwischen DataTemplate und DataContext in WPF?

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

Und ich kann auch die Beziehung zwischen View Modell und Blick durch folgende DataTemplate Syntax eingestellt:

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

Was ist der Unterschied zwischen den beiden? Setzt der zweite XAML den Datenkontext einer Ansicht nicht?

Antwort

8

Ihr zweiter XAML definiert eine Vorlage, mit der ein Objekt vom Typ viewModel:UserViewModel angezeigt werden kann. Es werden keine Daten für irgendetwas festgelegt, aber wenn ein ContentPresenter aufgefordert wird, ein Objekt dieses Typs anzuzeigen, verwendet es Ihre Vorlage.

Ihr erster XAML setzt die DataContext Eigenschaft Ihres Controls. Es definiert, dass alle Bindungen, die Sie in diesem Bereich ausführen, die DataContext als den Stamm der Bindung verwenden (sofern nicht explizit überschrieben). Für ein einfaches Beispiel für DataContext bei der Arbeit, zu vergleichen, diese beiden (beide davon ausgehen, dass „s“ ist der System Namespace):

<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> 

Beide StackPanels identisch machen, aber die zweite leichter wiederverwendet wird. (Z. B. müssen Sie die Bindung nur an einer Stelle ändern, wenn Sie ein anderes Datum anzeigen möchten.)

+0

Hallo Peter, Ben Danke an euch alle für die Antwort. Ich frage mich, ob ich den Datenkontext und Datamaplate eines Steuerelements auf das gleiche Ansichtsmodell festlegen kann? –

+0

@Ashish: Sie können den DataContext auf das ViewModel selbst setzen, aber Sie setzen das DataTemplate auf eine Vorlage, die * das ViewModel * anzeigt - nicht auf das ViewModel selbst. –

2

Die DataContext eines FrameworkElement ist, was das Element gebunden ist. Es ist grundsätzlich vom Typ object. Im MVVM-Muster ist dies meistens das ViewModel-Objekt, muss aber nicht. Es sind einfach einige Kontextinformationen, die Sie auf diese FrameworkElement anwenden möchten. Es wirkt sich nicht direkt auf die visuelle Darstellung aus.

Wenn WPF will einiges Objekt anzuzeigen, die seine eigene visuelle Darstellung nicht über (zB nicht von UIElement abstammen, wird es sehen, ob eine entsprechendes DataTemplate wie zu definieren existiert soll, dass die Daten vor. In Ihrem So haben Sie gesagt, dass die UserViewModel Klasse sollte die UserView Steuerung mit präsentiert werden, aber Sie haben nicht wirklich erstellt entweder die UserViewModel oder UserView.

Diese beiden Konzepte gehen oft zusammen. Zum Beispiel stellen Sie sich eine ObservableCollection<object> hatte, die hatte darin ein Foo und ein Bar Objekt.Sie ​​könnten verschiedenedefinierens für Foo und Bar. Dann könnten Sie Ihre Sammlung in eine ItemsControl binden. Jedes Objekt in dem Steuerelement würde eine visuelle Darstellung basierend auf dem entsprechenden DataTemplate von seinem Typ erhalten.

Ein weiteres einfaches Beispiel: Wenn Sie eine Eigenschaft auf Ihrem Viewmodel DisplayObject und Sie einfach benannt haben wollen, dass es mit erscheinen, was auch immer DataTemplate Sie definiert haben, können Sie die ContentPresenter Steuerung verwenden:

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

Auch diese Ergebnisse Suchen Sie in WPF die richtige Vorlage für den Typ und verwenden Sie diese, um eine Darstellung zu erstellen.

Verwandte Themen