WPF DataTemplate-und Bindung
Ich weiterhin mein Verständnis von MVVC mit der code von MSDN und ich habe eine Frage.
In der .xaml-Sie haben eine Liste der Befehle auf dem Bildschirm angezeigt.
<Border
Grid.Column="0"
Style="{StaticResource MainBorderStyle}"
Width="170"
>
<HeaderedContentControl
Content="{Binding Path=Commands}"
ContentTemplate="{StaticResource CommandsTemplate}"
Header="Control Panel"
Style="{StaticResource MainHCCStyle}"
/>
</Border>
Von hier, ich verstehe, dass der DataContext gesetzt ist (hier nicht gezeigt) und es zeigt die Sammlung der Befehle. Was ich nicht verstehe, ist die CommandsTemplate, die Sie unten sehen können:
<DataTemplate x:Key="CommandsTemplate">
<ItemsControl IsTabStop="False" ItemsSource="{Binding}" Margin="6,2">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Margin="2,6">pou
<Hyperlink Command="{Binding Path=Command}">
<TextBlock Text="{Binding Path=DisplayName}" />
</Hyperlink>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
Wie funktioniert die Bindung geschaffen wird? Wie dieser code sagen, um zu überprüfen, die Eigenschaft "Befehl" und "DisplayName" aus dem Objekt in die Sammlung? Ist es von der ItemsSource? Wenn ja, verstehe ich nicht, warum es nur bei {Binding}. Wer kann mir erklären bitte, wie das DataTemplate, bindearbeiten von einem ContentTemplate?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Sie sagte: der DataContext gesetzt ist, um die ViewModel-Klasse, also das Steuerelement, das Sie erwähnten in XAML wird in der Lage sein, um Zugriff auf die öffentlichen Eigenschaften des ViewModel.
Beispiel:
Die Struktur der Commander-Klasse.
VM hat die Eigenschaft, die man als Befehle, die möglicherweise ObservableCollection. Diese Eigenschaft zugegriffen werden kann von XAML.
Können Sie sich vorstellen, dass HeaderedContentControl ist ein container. Die Inhalte, die HeaderedContentControl ist ein DataTemplate "CommandsTemplate", die ein ItemsControl und binden die Befehle Eigentum des VM.
Content="{Binding Path=Befehle}"
Dann können Sie zu binden, ItemControl mit Befehlen wieder, aber die ItemControl ist innen die Inhalte, die Bindung an Befehle. So brauchen Sie nicht, um den Pfad wieder. Sie können einfach verwenden Sie
Zwei textblocks innerhalb ItemControl Sie sind also auf der gleichen Ebene wie der Commander-Klasse von Befehlen ObservableCollection. Das ist, warum Sie zugreifen können Text="{Binding Path=DisplayName}" direkt.
Hoffe, es hilft.
Die ItemsSource-Bindung zu {Binding} - bindet direkt an den DataContext des ItemsControl (das Aussehen der Kette, bis es findet einen Satz DataContext). In diesem Fall ist es in der HeaderedContentControl
Jedes Element im inneren ItemsControl wird, dann haben die DataContext gesetzt, um ein element in der Liste.
Den
<ItemsControl.ItemTemplate>
ist die Einstellung der Vorlage für jedes Element in der Liste nicht für das ItemsControl selbst. So, dass{Binding Path=Command}
und{Binding Path=DisplayName}
schauen sich diese Eigenschaften auf die Elemente innerhalb der Liste.Beispiel:
XAML
C#