C# 如何使用包含2种不同类型的2个列表的数据绑定项设置WPF树视图?

C# 如何使用包含2种不同类型的2个列表的数据绑定项设置WPF树视图?,c#,wpf,data-binding,treeview,C#,Wpf,Data Binding,Treeview,我正在尝试创建一个WPF treeview控件(在C#中,但这并不重要),它显示项目的层次列表。除此之外,树中的每个项目都有一个不同类型的“其他项目”列表,我也希望显示该列表(如下所示) 我想整个事情是数据绑定和支持拖放。我有一个只涉及“项”设置的基本列表,但是我在弄清楚如何支持第二个列表时遇到了一些困难。如果有人能给我指出我应该使用的ItemSource类型的方向,那会很有帮助 我需要多重绑定还是什么?以下是我目前正在尝试的(但没有成功) 其中,Name只是一个表示项名称的字符串,Comp

我正在尝试创建一个WPF treeview控件(在C#中,但这并不重要),它显示项目的层次列表。除此之外,树中的每个项目都有一个不同类型的“其他项目”列表,我也希望显示该列表(如下所示)

我想整个事情是数据绑定和支持拖放。我有一个只涉及“项”设置的基本列表,但是我在弄清楚如何支持第二个列表时遇到了一些困难。如果有人能给我指出我应该使用的ItemSource类型的方向,那会很有帮助

我需要多重绑定还是什么?以下是我目前正在尝试的(但没有成功)


其中,Name只是一个表示项名称的字符串,Components是其他项的(平面、非层次)只读集合


谢谢你的阅读

这是我用于TreeView的xaml

    <TreeView ItemsSource="{Binding Items}" >
        <i:Interaction.Behaviors>
            <Behaviors:TreeViewSelectedItemBehavior SelectedItem="{Binding SelectedItem,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
        </i:Interaction.Behaviors>
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                <Setter Property="FontWeight" Value="Normal" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FontWeight" Value="Bold" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TreeView.ItemContainerStyle>

        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding Description}" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

以及一个简化的VM,您可以将其用作两种VM类型的基类

public class TreeNodeViewModel
{
    public TreeNodeViewModel()
    {
        Children = new ObservableCollection<TreeNodeViewModel>();
    }

    public bool IsExpanded { get; set; }
    public bool IsSelected { get; set; }
    public string Description { get; set; }


    public ObservableCollection<TreeNodeViewModel> Children { get; set; }
}
公共类树设备模型
{
公共树设备模型()
{
Children=新的ObservableCollection();
}
公共布尔展开{get;set;}
公共布尔值被选为{get;set;}
公共字符串说明{get;set;}
公共可观测集合子项{get;set;}
}
并链接到

你好,安东,谢谢你抽出时间来帮助我。我确实考虑了这个选择,但它并不能真正解决这个问题。我不希望类型“otheritem”具有层次结构并具有子级。您的解决方案意味着在树状视图中对item和otheritem的处理方式相同。我使用上面的内容作为基础,在我的树状视图中表示多种类型的项。此外,我认为这些节点是专门用于树视图中的“容器”,而不是尝试和强迫我的VM和TeReVIEW以某种复杂的方式协同工作,所以只有容器有层次。
    <TreeView ItemsSource="{Binding Items}" >
        <i:Interaction.Behaviors>
            <Behaviors:TreeViewSelectedItemBehavior SelectedItem="{Binding SelectedItem,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
        </i:Interaction.Behaviors>
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                <Setter Property="FontWeight" Value="Normal" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FontWeight" Value="Bold" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TreeView.ItemContainerStyle>

        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding Description}" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
public class TreeNodeViewModel
{
    public TreeNodeViewModel()
    {
        Children = new ObservableCollection<TreeNodeViewModel>();
    }

    public bool IsExpanded { get; set; }
    public bool IsSelected { get; set; }
    public string Description { get; set; }


    public ObservableCollection<TreeNodeViewModel> Children { get; set; }
}