2011-09-02 45 views
3

我要显示绑定到一个模型 这一个TreeView不同的模板工程,但:使用不同层次树的

<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,对于第二子节点和第三个子节点,但替代另一个模板。

+0

随意问复选框的另一个问题。 – Will

回答

4

它比较简单。

定义该树被绑定三种不同类型:

// 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 { } 

构建它们并将它们添加到您的视图模型

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> 
+0

嗨请问,但是:在MVVM中,视图不应该知道该模型。也许更聪明的定义一个由ViewModel定义的BaseTreeView和Inject TreeViews,就像这样:复选框需要吗? - >注入TreeViewWithCheckboxes等......你怎么看? – skary

+0

@skary“在MVVM中,视图不应该知道模型。”绝对肯定不正确。而且,僵化的正统并不总是最好的行动方式。实用和可测试应该是你的目标。 – Will

+0

嗨,好吧,误解了,谢谢! – skary