【问题标题】:TreeView using HierarchicalDataTemplate使用 HierarchicalDataTemplate 的 TreeView
【发布时间】:2014-05-29 00:12:42
【问题描述】:

我已经把自己绕在车轴上好几天了。

我要做的是创建一个UserControl,其中包含TreeView。 TreeView 应该显示有关Show 的信息,而Show 中包含Instructions 的列表,依此类推……

我已尝试以各种方式执行此操作,但无法显示数据。这是我尝试过的一些代码 sn-ps:

<TreeView ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}, Path=DataContext.Show}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Path=Instructions}">
                    <TextBlock Text="{Binding Path=ShowName}"/>
                    <HierarchicalDataTemplate.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding Path=Sounds}">
                            <TextBlock Text="{Binding Path=Name}"/>
                            <HierarchicalDataTemplate.ItemTemplate>
                                <HierarchicalDataTemplate ItemsSource="{Binding Path=Nodes}">
                                    <TextBlock Text="{Binding Path=Name}"/>
                                    <HierarchicalDataTemplate.ItemTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding Name}"/>
                                        </DataTemplate>
                                    </HierarchicalDataTemplate.ItemTemplate>
                                </HierarchicalDataTemplate>
                            </HierarchicalDataTemplate.ItemTemplate>
                        </HierarchicalDataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

我也试过了……

<DockPanel>
        <DockPanel.Resources>
            <HierarchicalDataTemplate DataType="{x:Type show:Show}" ItemsSource="{Binding Path=Instructions}">
                <TextBlock Text="{Binding Path=ShowName}"/>
            </HierarchicalDataTemplate>
            <HierarchicalDataTemplate DataType="{x:Type show:Instruction}" ItemsSource="{Binding Path=Sounds}">
                <TextBlock Text="{Binding Path=Name}"/>
            </HierarchicalDataTemplate>
            <HierarchicalDataTemplate DataType="{x:Type show:SoundInstruction}" ItemsSource="{Binding Path=Nodes}">
                <TextBlock Text="{Binding Path=Name}"/>
            </HierarchicalDataTemplate>
            <DataTemplate DataType="{x:Type show:NodeInstruction}">
                <TextBlock Text="{Binding Path=Name}"/>
            </DataTemplate>
        </DockPanel.Resources>
        <TreeView ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}, Path=DataContext.Show}">
        </TreeView>
    </DockPanel>

但似乎没有任何效果。在我的MainWindow 中,我有这段代码初始化数据上下文:

            Show s = new Show("Hamlet");
            s.AddInstruction(new Instruction("Inst1"));
            s.AddInstruction(new Instruction("Inst2"));
            ShowViewModel vm = new ShowViewModel(s);
            DataContext = vm;

我们将不胜感激。

杰克

【问题讨论】:

  • 输出窗口是否出现绑定错误?
  • 来自System.Data?就像无法在 DataContext 中找到属性 Show 一样?没有

标签: c# wpf treeview hierarchicaldatatemplate


【解决方案1】:

您的 ItemsSource 必须绑定到 IEnumerable。从您的代码看来,您的 ShowViewModel.Show 是一个类型为 Show 的属性,它是一个对象。那不行,你必须把它变成一个集合(最好是ObservableCollection)。

您用来定义模板的第二种方式(并排,非嵌套)肯定更好。

另外,假设您没有将 DataContext 设置为您的 Window 和 DockPanel 之间的任何其他值,您可以更改此设置:

<TreeView ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}, Path=DataContext.Show}">

到这里:

<TreeView ItemsSource="{Binding Show}">

您的数据上下文会自动沿可视化树继承。

【讨论】:

  • 好吧,这更有意义。所以为了应用模板,有问题的项目必须是一个集合,它不能只是一个对象......这更有意义。 Show 已经有一个 ObservableCollection 的指令,所以我可以使用它。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多