WPF — DataGrid, показывающий только свойства базового класса

#c# #wpf #datagrid

#c# #wpf #datagrid

Вопрос:

Я пытаюсь заполнить DataGrid List<> несколькими объектами. Все эти объекты являются неотъемлемыми от базового класса. Мне удалось отобразить столбцы и строки в DataGrid, однако я вижу только свойства базового класса, а не свойства дочернего класса.

К сожалению, я не смог найти много полезной информации при поиске в Интернете. Но я все еще новичок в WPF и C #, так что, возможно, в этом проблема…

Как я могу заставить DataGrid отображать все свойства как базового, так и дочернего класса?

РЕДАКТИРОВАТЬ: У меня есть несколько классов (скажем, A, B, C), которые наследуются от базового класса, и у меня есть список типа List<BaseClass> , в котором хранятся несколько объектов нескольких типов. Мне нужно показать все различные дочерние классы в моей DataGrid.

Ответ №1:

 <DataGrid ItemsSource="{Binding}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Prop1}" />
            <DataGridTextColumn Binding="{Binding Prop2}" />
        </DataGrid.Columns>
</DataGrid>
  
 class Base
{
}

class Derived1: Base
{
    public string Prop1 { get; set; }
}

class Derived2: Base
{
    public string Prop2 { get; set; }
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    this.DataContext = new List<Base>()
    {
        new Derived1(){Prop1 = "Hello"},
        new Derived2() {Prop2 = "World"}
    };
}
  

У меня это работает. Я вижу Hello в первой строке и World во второй.

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

1. Да, это работает довольно хорошо. Единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что у меня есть пустые столбцы. Есть ли в DataGrid свойство для автоматического скрытия пустых столбцов? Мы с сокурсником искали один, но не смогли его найти.

2. Установите MinWidth=»0″ Width=»Auto» в DataGridColumns

Ответ №2:

Что T в вашем List<T> ? Метаданные типа выводятся из этого (по крайней мере, в привязке winforms; поэтому я предполагаю, что это относится и к WPF). Так что, если у вас есть List<BaseClass> , то будут показаны только свойства BaseClass . Попробуйте вместо этого использовать List<DerivedClass> .

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

1. Что, если мне нужно показать свойства нескольких производных классов и базового класса?

2. List<DerivedClass> должен отображать все в иерархии объектов вплоть до DerivedClass , но большинство сеток могут отображать только однородные данные — это будет работать только в том случае, если между объектами есть некоторая общность. Итак, если вы имеете в виду, что у вас есть A : BaseClass и a B : BaseClass , то вы не можете показывать A свойства и B properties одновременно. Вы можете отобразить общие свойства или создать список только A объектов или просто B объектов (в List<A> или List<B> соответственно).

3. Однако, если у вас есть C : BaseClass и A : C и B : C , то a List<C> покажет все из BaseClass и C

Ответ №3:

Попробуйте использовать List<ChildClass> вместо List<BaseClass> .

Ответ №4:

Я думаю, вы можете привязать свой DataGridColumn, который принадлежит дочерним классам.

имя объекта дочернего класса.имя свойства соответствующего дочернего класса