2014-09-01 2 views
0

Так что у меня 4 класса, например:WPF привязать DataGrid ко всем доступных переменных в классе

Class A Inherits I 
Public name as String 
Public ID as Integer 

Class B Inherits I 
Public test as String 
Public somethingElse as Integer 

Class C Inherits I 
Public banana as String 
Public Type as String 
Public length as Integer 

Class D Inherits I 
Public name as String 
Public ID as String 

Скажем, у меня есть ComboBox в моем WPF приложение, которое содержит список объектов I (некоторые из тип Class A, некоторый тип класса C и т. д. и т. д.).

Когда один выбран, я хочу, чтобы datagrid заполнил общедоступными переменными выбранных имен классов в левом столбце и значениями справа.

Я хочу, чтобы правая колонка была доступна для редактирования, но не обновляла переменные в классе напрямую.

Мои вопросы: как мне привязать datagrid к выбранному классу, если все/некоторые переменные различаются в каждом классе? И как мне сохранить связь с переменной, поэтому я могу обновить ее позже, если изменения, внесенные пользователем, проходят мою пользовательскую проверку?

Моя идея (что я не знаю, как реализовать):

  • бы нужен каждый класс какой-то метод преобразователя, что DataGrid может связываться? но если да, то какой будет этот метод?

  • Должен ли я просто отслеживать, что строка 1 содержит эту переменную и т. Д. Для каждого класса, поэтому я могу обновить ее позже?

ответ

1

Возможно, если вы пробовали это, прежде чем задавать свой вопрос, тогда у вас уже будет ваш ответ? В WPF, управление DataGrid обеспечивает функциональность, которая будет автоматически генерировать свои столбцы. На самом деле это поведение по умолчанию, и вам нужно отключить его, если вы этого не хотите. В вашем случае, однако, похоже, что вы хотите, чтобы он остался.

Вам потребуется ObservableCollection<I> свойства в коде позади или модели представления для привязки данных к DataGrid.ItemsSource собственности ... давайте назовем его Items:

<DataGrid ItemsSource="{Binding Items}" /> 

Теперь вот сложная часть, когда вы измените тип объекты в коллекции и должно попытаться связать данные все новые свойства к DataGrid.Columns коллекции:

List<A> classAItems = GetClassAItems(); 
Items = new ObservableCollection<I>(classAItems); 

Вот оно! Показать другой класс ?:

List<B> classBItems = GetClassBItems(); 
Items = new ObservableCollection<I>(classBItems); 

Вот и все!


ОБНОВЛЕНИЕ >>>

как можно иметь две колонки - "поле" и "значение", с каждой переменной заполнение строки?

Я, кажется, непреднамеренно ответил на ваш предыдущий вопрос ранее, а не на ваш фактический вопрос. Чтобы получить все заголовки столбцов правильно заполнены, вместо этого вы должны использовать ObservableCollection<object>.Чтобы иметь только общие свойства, заполненные заголовками столбцов, вы должны объявить интерфейс только с этими свойствами. После реализации этого интерфейса во всех ваших классах вы сможете отображать их все в одном DataGrid (даже в смешанном виде тот же сборник).

+0

Спасибо за это, я получаю с ней что-то. Вместо того, чтобы помещать имена переменных в заголовки столбцов, как я могу использовать два столбца - «поле» и «значение», причем каждая переменная заполняет строку? – simonalexander2005

+0

RE: Обновление - Спасибо, но это не то, что я имею в виду. Я не хочу, чтобы свойства были заголовками столбцов, я хочу, чтобы они были «заголовками строк», если хотите, вместо этого. поэтому мой datagrid будет ВСЕГДА иметь два столбца, независимо от того, сколько у меня свойств. Имеет ли это смысл? – simonalexander2005

+0

Для этого вам потребуется реструктурировать сбор данных. – Sheridan

Смежные вопросы