HierachicalDataTemplate和DataTemplate与ItemsControl

时间:2015-05-14 19:35:42

标签: c# wpf xaml mvvm datatemplate

我想知道HierarchicalDataTemplate和DataTemplate与此DataTemplate中的Itemcontrol之间的真正区别。

以下是一些示例代码:

MainWindow.xaml

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:test="clr-namespace:WpfApplication2"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <DataTemplate DataType="{x:Type test:TeamViewModel}">
            <TextBlock Text="{Binding Path=Name}"/>
        </DataTemplate>

        <!--<HierarchicalDataTemplate DataType="{x:Type test:TeamManagerViewModel}"
                                  ItemsSource="{Binding Path=Teams}"/>-->

        <DataTemplate DataType="{x:Type test:TeamManagerViewModel}">
            <ItemsControl ItemsSource="{Binding Path=Teams}"/>
        </DataTemplate>

    </Window.Resources>
    <Grid>
        <ContentControl Content="{Binding}"/>
    </Grid>
</Window>

ViewModel.cs

public class ViewModel : INotifyPropertyChanged
{
    #region INotifyPropertyChanged Members

    /// <summary>
    /// Event used by binding
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Notifies that a property has changed
    /// </summary>
    /// <param name="requestName">the property name</param>
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}

TeamManagerViewModel.cs

public class TeamManagerViewModel : ViewModel
{
    private ObservableCollection<TeamViewModel> _teams;

    public TeamManagerViewModel(ObservableCollection<TeamViewModel> teams)
    {
        _teams = teams;
    }

    public ObservableCollection<TeamViewModel> Teams
    {
        get { return _teams; }
        set
        {
            _teams = value;
            OnPropertyChanged("Teams");
        }
    }
}

TeamViewModel.cs

public class TeamManagerViewModel : ViewModel
{
    private ObservableCollection<TeamViewModel> _teams;

    public TeamManagerViewModel(ObservableCollection<TeamViewModel> teams)
    {
        _teams = teams;
    }

    public ObservableCollection<TeamViewModel> Teams
    {
        get { return _teams; }
        set
        {
            _teams = value;
            OnPropertyChanged("Teams");
        }
    }
}

因此结果是窗口中出现了名称列表。但是如果我用注释的HierarchicalDataTemplate替换TeamManagerViewModel的DataTemplate,则不会显示任何内容。

对我来说,看起来很奇怪,因为HierarchicalDataTemplate的ItemsSourceProperty应该查找TeamViewModel DataTemplate并使用它。 那是怎么回事?

另外一个问题是我的样本和MSDN之间有什么区别(除了在HierarchicalDataTemplate中添加TextBlock之外,它们似乎和我一样)?

https://msdn.microsoft.com/fr-fr/library/system.windows.hierarchicaldatatemplate%28v=vs.110%29.aspx

如果我写错了问题,也请原谅我,这是我第一次问SO。

谢谢:)

1 个答案:

答案 0 :(得分:0)

TreeViews使用

HierarchicalDataTemplates。来自documentation

  

TreeView可以通过绑定到数据源并使用HierarchicalDataTemplate对象来填充其树。

没有专门显示分层数据的

ItemsControls将不会使用该模板。我不能脱离我的头顶名称​​另一个控件那样......可能是菜单?不确定。但在TreeView使用此模板类型意味着,您不必在每个不代表叶子的模板中添加子TreeView 。这节省了一些时间。

设计不使用它们的控件肯定不会在您的参考资料中查找它们。

因为你似乎非常关心它实际使用的位置,所以我打开了JustDecompile并在类型上找到了一个Find Usages。

直接引用它的唯一UI类型是HeaderedItemsControl。所以扩展它的任何类型都是兼容的。其中包括MenuItemToolBarTreeViewItem和一些WF4设计器类型。

MenuItems由菜单使用,菜单包括色带和上下文菜单。工具栏就是这样。它们并不太令人兴奋。 TreeViews使用TreeViewItems。

您可以自行抓取JustDecompile副本,或浏览http://referencesource.microsoft.com/

,对不同类型进行进一步研究