如何在一个 TreeView 分支上绑定两个不同的集合
How to bind two different collection at one TreeView branch
我正在编写一个基于 MVVM 模式的 WpfCustomControlLibrary。我有一个包含 TreeView 对象的视图,它必须处理相当大的扩展模型。
型号:
public class TreeBranchesView
{
public ObservableCollection<DiscountGroup> DiscoutGroups { get; set; }
}
public class DiscountGroup : ViewModelBase
{
public int ID { get; set; }
public string GroupName { get; set; }
public decimal DefaultValue { get; set; }
private bool _isCheckedInMenu;
public bool IsCheckedInMenu
{
get { return _isCheckedInMenu; }
set
{
_isCheckedInMenu = value;
OnPropertyChanged("IsCheckedInMenu");
}
}
public ObservableCollection<SubGroup> SubGroups { get; set; }
public ObservableCollection<ArticleGroup> ArticleGroup { get; set; }
}
public class SubGroup : ViewModelBase
{
public int ID { get; set; }
public int SubGroupParent { get; set; }
public string Name { get; set; }
public decimal DefaultValue { get; set; }
public ObservableCollection<ArticleGroup> ArticleGroup { get; set; }
}
public class ArticleGroup
{
public int ArticleID { get; set; }
public int DiscountGroup { get; set; }
public int SubGroup { get; set; }
}
我的主要目标是实现以下情况:
-DiscountGroup
--ArticleGroup
--ArticleGroup
-DiscountGroup
--ArticleGroup
--ArticleGroup
--SubGroup
--SubGroup
--SubGroup
---ArticleGroup
---ArticleGroup
-DiscountGroup
-DiscountGroup
--SubGroup
ArticleGroup 和 SubGroups 可以位于同一级别。实际上我的 xaml 看起来像:
<GroupBox Grid.Column="0" Grid.Row="0" Header="MainTree">
<StackPanel Orientation="Horizontal">
<TreeView x:Name="MainTreeView" Grid.Column="0" Grid.Row="0" ItemTemplate="{StaticResource level1}"
ItemsSource="{Binding TreeBranches}" />
</StackPanel>
</GroupBox>
所有模板都存储在windows.resources
下
<Window.Resources>
<HierarchicalDataTemplate x:Key="level2" ItemsSource="{Binding ArticleGroup}" >
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="level1" ItemsSource="{Binding SubGroups}" ItemTemplate="{StaticResource level2}" >
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding GroupName}" />
</StackPanel.ContextMenu>
</StackPanel>
</HierarchicalDataTemplate>
</Window.Resources>
我有以下问题 - TreeView 必须在同一级别显示两个不同的集合,上面的代码 不允许这样做 ,目前它只处理一个。重要的是,这些集合的类型不同。
一个解决方案是为将要放置在树中的项目创建一个基础 class,比方说 TreeNode。这个基地 class 有这个接口:
public interface ITreeNode
{
ObservableCollection<ITreeNode> Children { get; set; }
string Name { get; set; }
ITreeNode Parent { get; set; }
void AddChild(ITreeNode child);
void RemoveChild(ITreeNode child);
}
使树上需要出现的classes继承自TreeNode class:
public class DiscountGroup: TreeNode{};
public class SubGroup: TreeNode {}
public class ArticleGroup: TreeNode{}
然后为你的树定义一个根:
Root = new TreeNode() {Name="Root"};
添加一些分支
var dg1 = new DiscountedGroup(){Name = "DG1"};
var dg1 = new DiscountedGroup(){Name = "DG1"};
Root.AddChild(dg1);
Root.AddChild(dg2};
添加一些children到分支
dg1.AddChild(new ArticleGroup());
dg1.AddChild(new SubGroup());
dg2.AddChild(new ArticleGroup());
dg2.Add(new SubGroup());
您可以根据需要添加任意多个图层。然后,在 Xaml 中,将 root.Children 绑定到您的 TreeView.TreeViewItem.ItemsSource.
确保在 Xaml=>TreeViewItem.Resources 中为 Objects(或 classes)定义了 HierarchicalDataTemplate,其中 children(否则只需使用DataTemplate) 并使用 TreeViewItem.ItemTemplateSelector 检测每个 class.
的正确数据模板
里面还有很多细节,我尽量笼统的解释一下。
我正在编写一个基于 MVVM 模式的 WpfCustomControlLibrary。我有一个包含 TreeView 对象的视图,它必须处理相当大的扩展模型。
型号:
public class TreeBranchesView
{
public ObservableCollection<DiscountGroup> DiscoutGroups { get; set; }
}
public class DiscountGroup : ViewModelBase
{
public int ID { get; set; }
public string GroupName { get; set; }
public decimal DefaultValue { get; set; }
private bool _isCheckedInMenu;
public bool IsCheckedInMenu
{
get { return _isCheckedInMenu; }
set
{
_isCheckedInMenu = value;
OnPropertyChanged("IsCheckedInMenu");
}
}
public ObservableCollection<SubGroup> SubGroups { get; set; }
public ObservableCollection<ArticleGroup> ArticleGroup { get; set; }
}
public class SubGroup : ViewModelBase
{
public int ID { get; set; }
public int SubGroupParent { get; set; }
public string Name { get; set; }
public decimal DefaultValue { get; set; }
public ObservableCollection<ArticleGroup> ArticleGroup { get; set; }
}
public class ArticleGroup
{
public int ArticleID { get; set; }
public int DiscountGroup { get; set; }
public int SubGroup { get; set; }
}
我的主要目标是实现以下情况:
-DiscountGroup
--ArticleGroup
--ArticleGroup
-DiscountGroup
--ArticleGroup
--ArticleGroup
--SubGroup
--SubGroup
--SubGroup
---ArticleGroup
---ArticleGroup
-DiscountGroup
-DiscountGroup
--SubGroup
ArticleGroup 和 SubGroups 可以位于同一级别。实际上我的 xaml 看起来像:
<GroupBox Grid.Column="0" Grid.Row="0" Header="MainTree">
<StackPanel Orientation="Horizontal">
<TreeView x:Name="MainTreeView" Grid.Column="0" Grid.Row="0" ItemTemplate="{StaticResource level1}"
ItemsSource="{Binding TreeBranches}" />
</StackPanel>
</GroupBox>
所有模板都存储在windows.resources
下<Window.Resources>
<HierarchicalDataTemplate x:Key="level2" ItemsSource="{Binding ArticleGroup}" >
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="level1" ItemsSource="{Binding SubGroups}" ItemTemplate="{StaticResource level2}" >
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding GroupName}" />
</StackPanel.ContextMenu>
</StackPanel>
</HierarchicalDataTemplate>
</Window.Resources>
我有以下问题 - TreeView 必须在同一级别显示两个不同的集合,上面的代码 不允许这样做 ,目前它只处理一个。重要的是,这些集合的类型不同。
一个解决方案是为将要放置在树中的项目创建一个基础 class,比方说 TreeNode。这个基地 class 有这个接口:
public interface ITreeNode
{
ObservableCollection<ITreeNode> Children { get; set; }
string Name { get; set; }
ITreeNode Parent { get; set; }
void AddChild(ITreeNode child);
void RemoveChild(ITreeNode child);
}
使树上需要出现的classes继承自TreeNode class:
public class DiscountGroup: TreeNode{};
public class SubGroup: TreeNode {}
public class ArticleGroup: TreeNode{}
然后为你的树定义一个根:
Root = new TreeNode() {Name="Root"};
添加一些分支
var dg1 = new DiscountedGroup(){Name = "DG1"};
var dg1 = new DiscountedGroup(){Name = "DG1"};
Root.AddChild(dg1);
Root.AddChild(dg2};
添加一些children到分支
dg1.AddChild(new ArticleGroup());
dg1.AddChild(new SubGroup());
dg2.AddChild(new ArticleGroup());
dg2.Add(new SubGroup());
您可以根据需要添加任意多个图层。然后,在 Xaml 中,将 root.Children 绑定到您的 TreeView.TreeViewItem.ItemsSource.
确保在 Xaml=>TreeViewItem.Resources 中为 Objects(或 classes)定义了 HierarchicalDataTemplate,其中 children(否则只需使用DataTemplate) 并使用 TreeViewItem.ItemTemplateSelector 检测每个 class.
的正确数据模板里面还有很多细节,我尽量笼统的解释一下。