要在一个数据模板中绑定的不同类型的树视图项

时间:2017-08-18 09:09:36

标签: c# wpf mvvm treeview

我有一个基于MVVM的Usercontrol。该模型有两个类,一个类具有另一个类的列表,如下面的模型所示。问题是我有两个为我的树视图定义两个不同的hierarchicaldatatemplate,它们也绑定到错误的模型。我想只做一个hierarchydatatemplate,它只知道我的viewmodel中的属性。最后,我想要的只是一个树视图:

| Familyname

|| PERSONNAME

|| PERSONNAME

代码非常大,所以我已经采取了一些措施。如果需要更多信息,请告诉我们:

模型

public class Family
{
private string m_Name;
public string NameOfFamily
    {
        get { return m_Name; }
        set { m_Name= value; }
    } 
    public ObservableCollection<Person> Persons{ get; set ; }
}

public class Person
{
private string m_Name;
public string NameOfPerson
    {
        get { return m_Name; }
        set { m_Name= value; }
    } 

}

在视图模型中,我收到了与其各自人员的家人,例如

视图模型

Family Fam = GetFamilywithrespectivepersons;

查看

<TreeView Name="myTreeView" Grid.Column="0" Width="Auto" Height="300" ItemsSource="{Binding Fam}">
   <TreeView.Resources>
      <HierarchicalDataTemplate  DataType="{x:Type classes:Family}" ItemsSource="{Binding Persons}">                      
                        <TreeViewItem Header="{Binding NameOfFamily}"></TreeViewItem>                                             
       </HierarchicalDataTemplate>
       <HierarchicalDataTemplate  DataType="{x:Type classes:Person}">                                                
                        <TreeViewItem Header="{Binding NameOfPerson}"></TreeViewItem>                                                                 
        </HierarchicalDataTemplate>
 </TreeView.Resources>
</TreeView>

1 个答案:

答案 0 :(得分:0)

每种类型定义DataTemplate肯定没错。但由于Person类没有子节点,因此DataTemplate不必是分层的。

此外,模板不应包含任何TreeViewItem元素:

<TreeView Name="myTreeView" Grid.Column="0" Width="Auto" Height="300" ItemsSource="{Binding Fam}">
    <TreeView.Resources>
        <HierarchicalDataTemplate  DataType="{x:Type classes:Family}" ItemsSource="{Binding Persons}">
            <TextBlock Text="{Binding NameOfFamily}" />
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type classes:Person}">
            <TextBlock Text="{Binding NameOfPerson}" />
        </DataTemplate>
    </TreeView.Resources>
</TreeView>