#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
и aB : BaseClass
, то вы не можете показыватьA
свойства иB
properties одновременно. Вы можете отобразить общие свойства или создать список толькоA
объектов или простоB
объектов (вList<A>
илиList<B>
соответственно).3. Однако, если у вас есть
C : BaseClass
иA : C
иB : C
, то aList<C>
покажет все изBaseClass
иC
Ответ №3:
Попробуйте использовать List<ChildClass>
вместо List<BaseClass>
.
Ответ №4:
Я думаю, вы можете привязать свой DataGridColumn, который принадлежит дочерним классам.
имя объекта дочернего класса.имя свойства соответствующего дочернего класса