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