Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HierachicalDataTemplate和带有ItemsControl的DataTemplate之间的差异_C#_Wpf_Xaml_Mvvm_Datatemplate - Fatal编程技术网

C# HierachicalDataTemplate和带有ItemsControl的DataTemplate之间的差异

C# HierachicalDataTemplate和带有ItemsControl的DataTemplate之间的差异,c#,wpf,xaml,mvvm,datatemplate,C#,Wpf,Xaml,Mvvm,Datatemplate,我想知道HierarchycalDataTemplate和在此DataTemplate中包含Itemcontrol的DataTemplate之间的真正区别 以下是一些示例代码: MainWindow.xaml ViewModel.cs TeamManagerViewModel.cs TeamViewModel.cs 因此,其结果是窗口中出现的名称列表。但是,如果我用注释的HierarchycalDataTemplate替换TeamManagerViewModel的DataTemplate,则不会

我想知道HierarchycalDataTemplate和在此DataTemplate中包含Itemcontrol的DataTemplate之间的真正区别

以下是一些示例代码:

MainWindow.xaml

ViewModel.cs

TeamManagerViewModel.cs

TeamViewModel.cs

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

对我来说,这似乎很奇怪,因为HierarchycalDataTemplate的ItemsSourceProperty应该查找并使用TeamViewModel数据模板。怎么样

还有一个问题,我的示例和MSDN示例之间有什么区别?除了在HierarchycalDataTemplate中添加一个TextBlock之外,它们似乎和我做的一样

如果我的问题写得不好,也请原谅,这是我第一次问这样的问题

谢谢:

TreeView使用HierarchycalDataTemplates。从

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

没有专门显示层次结构数据的ItemsControl将不使用该模板。我无法在脑海中说出另一个控件的名字。。。可能是菜单?不确定。但是在树视图中,使用这种模板类型意味着您不必在每个不表示叶的模板中添加子树视图。这样可以节省一些时间

不使用它们的控件肯定不会在您的资源中查找它们

因为您似乎非常关心它的实际使用位置,所以我打开JustDecompile并查找了该类型的用法

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

菜单项由菜单使用,菜单包括功能区和上下文菜单。工具栏就是这样。它们不太令人兴奋。并且TreeView使用TreeView项


你可以通过自己抓取一份JustDecompile的副本,或者浏览

来进一步研究不同类型的数据,MSDN对此并不十分清楚,但你是说Hierarchy-CalDataTemplates只意味着只能与树视图项和菜单一起使用吗?@ManuT AFAICT,是的。我想不起来除了在树上看之外,我还用过它们。编辑Inbound我还不能升级投票,但是,使用JustDecompile是一个非常好的工具,因此,虚拟升级投票:这在未来将非常有用。
<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>
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
}
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");
        }
    }
}
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");
        }
    }
}