WPF DataTemplate和Binding

Pat*_*ins 6 c# data-binding wpf templates .net-3.5

我用MSDN代码继续理解MVVC,我有一个问题.

在.xaml中,它们有一个显示在屏幕上的命令列表.

   <Border 
    Grid.Column="0" 
    Style="{StaticResource MainBorderStyle}"
    Width="170"
    >
    <HeaderedContentControl
      Content="{Binding Path=Commands}"
      ContentTemplate="{StaticResource CommandsTemplate}"
      Header="Control Panel"
      Style="{StaticResource MainHCCStyle}"
      />
  </Border>
Run Code Online (Sandbox Code Playgroud)

从这里,我了解DataContext已设置(此处未显示),它将显示命令集合.我不明白的是你可以在下面看到的CommandsTemplate:

<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>
Run Code Online (Sandbox Code Playgroud)

如何创建绑定?这段代码如何告诉从集合中的对象检查属性Command和DisplayName?它来自ItemsSource吗?如果是,我不明白为什么它只在{Binding}.任何人都可以解释我,DataTemplate绑定如何从ContentTemplate工作?

Mic*_*ync 9

如上所述,DataContext设置为ViewModel类,因此您在XAML中提到的控件将能够访问该ViewModel的公共属性.

例如:

private ObservableCollection<Commander> commands = new ObservableCollection<Commander>();

    public ObservableCollection<Commander> Commands {
        get { return commands; }
        set { commands = value; }
    }
Run Code Online (Sandbox Code Playgroud)

Commander类的结构.

public class Commander {
    public ICommand Command { get; set; }
    public string DisplayName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

该VM具有名为Commands的属性,该属性可能是ObservableCollection.可以从XAML访问此属性.

你可以想象HeaderedContentControl是一个容器.HeaderedContentControl的内容是DataTemplate"CommandsTemplate",它具有ItemsControl并且它绑定到VM的Commands属性.

Content ="{Binding Path = Commands}"

然后,您可以再次将ItemControl与Commands绑定,但ItemControl位于绑定到Commands的内容中.因此,您无需再次指定路径.你可以使用

 ItemsSource="{Binding}" instead of ItemsSource="{Binding Commands}".
Run Code Online (Sandbox Code Playgroud)

ItemControl中有两个文本块,因此它们与Commander ObservableCollection的Commander类处于同一级别.这就是你可以直接访问Text ="{Binding Path = DisplayName}"的原因.

希望能帮助到你.