对树的不同级别使用不同的模板

发布于 2024-12-02 19:23:35 字数 1319 浏览 0 评论 0原文

我想显示绑定到模型的树视图 它有效,但是:

<TreeView ItemsSource="{Binding Items}">
            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}" >
                    <Style.Triggers>
                        <Trigger Property="HasItems" Value="true">
                            <Setter Property="Focusable" Value="False"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TreeView.ItemContainerStyle>
                <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding SubNodes}">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="20"/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <CheckBox Grid.Column="0"/>
                        <TextBlock Text="{Binding Text}" Grid.Column="1"/>
                    </Grid>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

我想要三个模板:一个用于 rootitem ,第二个用于子节点,第三个用于子节点,但可以替代另一个模板。

i want to Display a treeview bound to a Model
It works but:

<TreeView ItemsSource="{Binding Items}">
            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}" >
                    <Style.Triggers>
                        <Trigger Property="HasItems" Value="true">
                            <Setter Property="Focusable" Value="False"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TreeView.ItemContainerStyle>
                <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding SubNodes}">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="20"/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <CheckBox Grid.Column="0"/>
                        <TextBlock Text="{Binding Text}" Grid.Column="1"/>
                    </Grid>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

I want to have three Templates : one for the rootitem , a second for the subnodes and a third for subnodes but alternative to the other template.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

末が日狂欢 2024-12-09 19:23:35

其相对简单。

定义树绑定的三种不同类型:

// defines root nodes in the tree
public sealed class RootNode : ITreeNode // or some other interface or base type
{
    public IEnumerable<SubNode> SubNodes {get;set;}
}

//  defines all middle nodes
public class SubNode : ITreeNode
{
   public IEnumerable<SubNode> Children {get;set;}
}

// defines leafs
public sealed class LeafNode : SubNode { }

构造它们并将它们添加到 ViewModel

public sealed class ViewModel 
{
    // or use an OC<T> or whatever your design needs
    public IEnumerable<RootNode> Roots {get;set;}

然后使用 HierarchicalDataTemplate.DataType 为每个指定模板:

<TreeView
  ItemsSource="{Binding Roots}">
  <TreeView.Resources>
      <HierarchicalDataTemplate 
          xmlns:t="clr-namespace:NamespaceForNodeClasses"
          DataType="{x:Type t:RootNode}
          ItemsSource="{Binding SubNodes}">
          <TextBlock Text="I'm a root node!"/>
      </HierarchicalDataTemplate>
      <HierarchicalDataTemplate 
          xmlns:t="clr-namespace:NamespaceForNodeClasses"
          DataType="{x:Type t:SubNode}
          ItemsSource="{Binding Children}">
          <TextBlock Text="I'm a regular tree node!"/>
      </HierarchicalDataTemplate>
      <HierarchicalDataTemplate 
          xmlns:t="clr-namespace:NamespaceForNodeClasses"
          DataType="{x:Type t:LeafNode}>
          <TextBlock Text="I'm a leaf!"/>
      </HierarchicalDataTemplate>
  </TreeView.Resources>
</TreeView>

Its relatively simple.

Define three different types to which the tree is bound:

// defines root nodes in the tree
public sealed class RootNode : ITreeNode // or some other interface or base type
{
    public IEnumerable<SubNode> SubNodes {get;set;}
}

//  defines all middle nodes
public class SubNode : ITreeNode
{
   public IEnumerable<SubNode> Children {get;set;}
}

// defines leafs
public sealed class LeafNode : SubNode { }

Construct them and add them to your ViewModel

public sealed class ViewModel 
{
    // or use an OC<T> or whatever your design needs
    public IEnumerable<RootNode> Roots {get;set;}

Then use HierarchicalDataTemplate.DataType to designate the template for each:

<TreeView
  ItemsSource="{Binding Roots}">
  <TreeView.Resources>
      <HierarchicalDataTemplate 
          xmlns:t="clr-namespace:NamespaceForNodeClasses"
          DataType="{x:Type t:RootNode}
          ItemsSource="{Binding SubNodes}">
          <TextBlock Text="I'm a root node!"/>
      </HierarchicalDataTemplate>
      <HierarchicalDataTemplate 
          xmlns:t="clr-namespace:NamespaceForNodeClasses"
          DataType="{x:Type t:SubNode}
          ItemsSource="{Binding Children}">
          <TextBlock Text="I'm a regular tree node!"/>
      </HierarchicalDataTemplate>
      <HierarchicalDataTemplate 
          xmlns:t="clr-namespace:NamespaceForNodeClasses"
          DataType="{x:Type t:LeafNode}>
          <TextBlock Text="I'm a leaf!"/>
      </HierarchicalDataTemplate>
  </TreeView.Resources>
</TreeView>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文