TreeView数据绑定到列表列表

时间:2017-03-06 07:19:25

标签: c# wpf treeview

我是WPF的新手,我不得不创建一个绑定到列表列表等列表的Treeview,子节点的数量可以根据需要增加。我已经创建了两个HierarchicalDataTemplates来测试代码,但子节点没有出现

我的树视图定义为

<telerik:RadTabItem Header="Lookup Sets">
    <telerik:RadTreeView IsLoadOnDemandEnabled="True" ItemsSource="{Binding AttributeLookupSetConversions}">
        <telerik:RadTreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type cm:AttributeLookupSetConversion}">
                <CheckBox Content="{Binding Path=Name}"  IsChecked="{Binding Path=IsSelected, Mode=TwoWay}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type telerikDocking:RadSplitContainer}}, Path=DataContext.UpdateSelectionCommand}"/>
            </HierarchicalDataTemplate>
            <HierarchicalDataTemplate DataType="{x:Type cm:AttributeConversion}">
                <CheckBox Content="{Binding Path=Name}"  IsChecked="{Binding Path=IsSelected, Mode=TwoWay}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type telerikDocking:RadSplitContainer}}, Path=DataContext.UpdateSelectionCommand}"/>
            </HierarchicalDataTemplate>
        </telerik:RadTreeView.Resources>
    </telerik:RadTreeView>
</telerik:RadTabItem>

我是否缺少某些东西或是否需要在代码中创建节点?我有一个tabControl,其中包含列表列表的treeViews,问题是一个选项卡可以包含由Id关联的另一个treeView的项目,所以如果我说的是示例

stundents
    -Student1
        -Course 1
        -Course 2
           - Department 1
     -Student 2
         -Course 6
            Department12

Course
    -Qualification 1
        -WorkType

1 个答案:

答案 0 :(得分:2)

创建一个类作为所有ltem的根,其中DisplayName和其他Item的observablecollection:

public class Item : INotifyPropertyChanged
{ 
    string _displayText;
    public string DisplayText { get { return _displayText; } set { _displayText = value; RaisePropertyChanged("DisplayText"); } }

    ObservableCollection<Item> _items;
    public ObservableCollection<Model> Items { get { return _items; } set { _items = value; RaisePropertyChanged("Items"); } }

    public event PropertyChangedEventHandler PropertyChanged;
    internal void RaisePropertyChanged(string propname)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propname));
    }
} 

任何其他类型(学生,教师,课程,部门等)必须来自此课程。他们也可能有自己的特定属性。

public class Student : Item
{
}
public class Course : Item
{
}
public class Qualification : Item
{
}

请注意,如果您有两种类型的Course类(具有不同的内部项目列表),请为它们创建两个单独的类。

现在,您应该在视图模型中填充observableCollection,并且所有内容都将在TreeView中处理,如下所示:

<TreeView DataContext="{Binding}" ItemsSource="{Binding Items}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Items}">
            <TextBlock Text="{Binding DisplayText}"/>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>