Как связать две разные коллекции в одной ветви TreeView - PullRequest
0 голосов
/ 21 июня 2019

Я пишу WpfCustomControlLibrary на основе шаблона MVVM.У меня есть представление, содержащее объект 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 и подгруппы могут быть расположены на одном уровне.На самом деле мой 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 должен показывать две разные коллекции на одном уровне и вышекод не позволяет сделать это , на данный момент он обрабатывает только один.Что важно, эти коллекции не имеют одинаковый тип.

1 Ответ

0 голосов
/ 21 июня 2019

Одним из решений является создание базового класса, скажем, TreeNode, для элементов, которые будут размещены в дереве. Этот базовый класс имеет этот интерфейс:

public interface ITreeNode
{
    ObservableCollection<ITreeNode> Children { get; set; }
    string Name { get; set; }
    ITreeNode Parent { get; set; }
    void AddChild(ITreeNode child);
    void RemoveChild(ITreeNode child);
}

Создайте классы, которые должны появиться в дереве, чтобы наследоваться от класса TreeNode:

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};

Добавить детей в ветки

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 у вас есть HierarchicalDataTemplate, определенный для объектов (или классов), у которых есть дочерние элементы (в противном случае просто используется DataTemplate), и используйте TreeViewItem.ItemTemplateSelector для определения правильного шаблона данных для каждого класса.

В этом есть больше деталей, я пытался объяснить в общем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...