Построить представление дерева на основе объекта, полученного с помощью отражения

#c# #wpf #reflection #proxy

#c# #wpf #отражение #прокси

Вопрос:

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

Объект для просмотра.

Новый объект для просмотра. Попытка сделать в этой форме

     <TreeView
            Grid.Row="1"
            Grid.Column="0"
            ItemsSource="{Binding LanguageInformation.Items}">
            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                </Style>
            </TreeView.ItemContainerStyle>
            <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type local:LocalizationBrowserViewModel}" ItemsSource="{Binding LanguageInformation.Items}">
                    <TextBlock Text="{Binding}"/>
                </HierarchicalDataTemplate>
            </TreeView.Resources>
        </TreeView>
  

Класс для представления

 public class Element
{
    public string Name { get; set; }
    public ObservableCollection<object> Items { get; set; }
    public Element()
    {
        this.Items = new ObservableCollection<object>();

    }
}
  

Ответ №1:

Element Класс теперь допускает только один уровень иерархии. Для поддержки N уровней Element класс необходимо изменить, как показано ниже

 public class Element
{
    public string Name { get; set; }
    public ObservableCollection<Element> Items { get; set; }
    public Element()
    {
        this.Items = new ObservableCollection<Element>();

    }
}
  

TreeView необходимо заменить на ListView , поскольку скриншот, приведенный в вопросе, содержит несколько столбцов. TreeView не допускает нескольких столбцов, кроме ListView .

ListView в WPF поддерживается HierarchicalDataTemplate . Вы можете обратиться к HierarchicalDataTemplate в WPF для реализации.

Комментарии:

1. Спасибо. И как я могу правильно создать представление, учитывая, что объект является прокси? Как я могу ввести данные в поле Name? И вот еще один обновленный снимок экрана.

2. И еще один момент. Я получаю объект с помощью отражения (введите как объект). И этот объект получает свой тип при компиляции.

3. Прокси на вашем скриншоте содержит экземпляр объекта. Вы можете обновить значение этих свойств с помощью отражения.

4. Не могли бы вы объяснить, как это можно сделать? В то же время, возможно ли отобразить этот объект в виде дерева?

5. Вы можете пройти через learn.microsoft.com/en-us/dotnet/api /… чтобы увидеть образцы отражения. Также вам необходимо создать коллекцию ViewModel с использованием reflection для привязки ListView.