Как я могу создать иерархический комбинированный список с использованием WPF? - PullRequest
2 голосов
/ 27 декабря 2010

Я хочу создать иерархический комбинированный список в WPF. Я буду связывать комбинированный список с коллекцией классов, структура которых приведена ниже:

Public Class Folder                 
{     
  Public string Name;            
  Public string Path;           
  List<SubFolder> SubFolder;   
}

И я хочу, чтобы поле со списком выглядело так:

------------------------
| Folder.Name                                                                      
|      SubFolder.Name  |
|      SubFolder.Name  |
|      SubFolder.Name  |
----------------------
------------------------
| Folder.Name           
|      SubFolder.Name  |
|      SubFolder.Name  |
|      SubFolder.Name  |
----------------------
------------------------
| Folder.Name                                                                       
|      SubFolder.Name  |
|      SubFolder.Name  |
|      SubFolder.Name  |
------------------------

Пользователь должен иметь возможность выбрать либо папку, либо подпапку.

Пожалуйста, скажите мне, как я могу это сделать.

Ответы [ 2 ]

2 голосов
/ 27 декабря 2010

Чтобы это вписалось в модель поля со списком, представляющего собой ItemsControl, который отображает последовательный список отдельных элементов, вам нужно сгладить иерархию в один список.

Поскольку я ленив, я бы создал модель представления, которая выставляет свойства Padding и Text, а затем получил бы код, заполняющий модель представления, установив Padding на основе уровня каждого элемента в иерархии. , Затем я бы создал шаблон элемента для поля со списком, который выглядел бы так:

<DataTemplate>
   <TextBlock Padding="{Binding Padding}" Text="{Binding Text}"/>
</DataTemplate>

У этого подхода много недостатков. Но его легко построить, и он быстро даст вам понять, действительно ли это правильный способ представления этой информации.

0 голосов
/ 27 декабря 2010

Я не знаю, подходит ли вам это решение, но:

  1. Создайте новое приложение WPF (например, HierarchicalComboBox) и вставьте приведенный ниже код вместо кода Window1.xaml.cs:

    public partial class Window1 : Window
    {
        public ObservableCollection<Folder> Folders { get; set; }
    
    
    <pre><code>public Window1()
    {
        var folders = new List&lt;Folder&gt;
                      {
                        new Folder()
                          {
                            Name = "First",
                            SubFolders =
                              new ObservableCollection&lt;Folder&gt;
                                {
                                  new Folder() {Name = "FirstFolderFirstSub"},
                                  new Folder() {Name = "FirstFolderSecondSub"},
                                  new Folder() {Name = "FirstFolderThirdSub"}
                                }
                          },
                          new Folder()
                          {
                            Name = "Second",
                            SubFolders =
                              new ObservableCollection&lt;Folder&gt;
                                {
                                  new Folder() {Name = "SecondFolderFirstSub"},
                                  new Folder() {Name = "SecondFolderSecondSub"},
                                  new Folder() {Name = "SecondFolderThirdSub"}
                                }
                          }
                      };
      Folders = new ObservableCollection&lt;Folder&gt;(folders);
      InitializeComponent();
      DataContext = this;
    
    
    }
    
    } папка публичного класса { публичная строка Name {get; задавать; } public ObservableCollection SubFolders {get; задавать; } }
  2. Затем в Window1.xaml вставьте следующий код:

    <Window x:Class="HierarchicalComboBox.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:HierarchicalComboBox="clr-namespace:HierarchicalComboBox" Title="Window1">
        <Window.Resources>
            <HierarchicalDataTemplate DataType="{x:Type HierarchicalComboBox:Folder}">
                <StackPanel>
                    <TextBlock Text="{Binding Name}"/>
                    <ComboBox Margin="8,0,0,0" ItemsSource="{Binding SubFolders}"/>
                </StackPanel>
            </HierarchicalDataTemplate>
        </Window.Resources>
        <Grid>
            <ItemsControl x:Name="HierarchicalComboBox" ItemsSource="{Binding Folders}" VerticalAlignment="Top">
            </ItemsControl>
        </Grid>
    </Window>  
    

Пояснение:

В Window.Resources мы объявили HierarchicalDataTemplate, который должен связать наш класс ViewModel (здесь это Folder класс) с соответствующим View, который является содержимым HierarchicalDataTemplate.

Затем в Window1.xaml мы пишем содержимое ItemsControl, в котором будет размещен наш список папок.

Вот и все, вы можете сделать это аналогичным образом в своем решении. Надеюсь это поможет. Если у вас есть какие-либо вопросы, тогда добро пожаловать в комментарии.

О ФОРМАТИРОВАНИИ

Извините за плохое форматирование, но ничего не могу с этим сделать. Если у некоторых из вас есть возможность редактировать ответы, попробуйте переформатировать примеры кода.

...