HierarchicalDataTemplate中的多个模板?

时间:2014-04-02 19:11:12

标签: wpf xaml treeview

我对XAML和WPF来说是全新的,所以也许(希望)有一个简单的解决方案。

这基本上就是树的样子:

☑MyViewModel
| _ Property1
|
_Property2

☑MyViewModel
| _ Property1
|
_Property2

以下是代码:

<HierarchicalDataTemplate x:Uid="HierarchialDataTemplate2" DataType="{x:Type vm:MyViewModel}" ItemTemplate="{StaticResource Template1}">

     <HierarchialDataTemplate.ItemContainerStyle>
          <!-- style information -->
     </HierarchialDataTemplate.ItemContainerStyle>

     <HierarchialDataTemplate.ItemSource>
          <MultiBinding x:Uid="MultiBinding1" Converter="{StaticResource CollectionConcatinator}">
               <Binding x:Uid="Binding1" Path="Property1"/>
               <Binding x:Uid="Binding2" Path="Property2"/>
          </MultiBinding>
     </HierarchialDataTemplate.ItemSource>

     <StackPanel x:Uid="frame" x:Name="frame" Orientation="Horizontal">
          <!-- basic checkbox and name for top level of the tree node-->
     </StackPanel>

</HierarchialDataTemplate>

我想将Template1应用于 Property1,而不将任何模板应用于Property2。有没有办法做到这一点?

我尝试使用ContentPresenter for Property1,但我只能将它显示在树的顶层,以及复选框和名称旁边。这是我使用的ContentPresenter:

<ContentPresenter x:Uid="Property1Content" x:Name="Property1Content" Content="{Binding Property1} ContentTemplate={StaticResource Template1}"> </ContentPresenter>

如果我尝试将ContentPresenter放在StackPanel之外的任何地方,我收到了错误。

1 个答案:

答案 0 :(得分:0)

您可以使用Treeview的ItemTemplateSelector

public class TreeViewTemplateSelector : DataTemplateSelector
{

    private DataTemplate _Template1;
    public DataTemplate Template1
    {
        get { return _Template1; }
        set { _Template1 = value; }
    }

    private DataTemplate _Template2;
    public DataTemplate Template2
    {
        get { return _Template2; }
        set { _Template2 = value; }
    }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        return item.GetType() == typeof(property1) ? Template1 : Template2;
    }

}

在Treeview中放置xaml

<TreeView.ItemTemplateSelector>
    <yourNamespace:TreeViewTemplateSelector Template1="{StaticResource template1}" Template2="{StaticResource template1}">
    </c:TreeViewTemplateSelector>
</TreeView.ItemTemplateSelector>