Динамически указывать и изменять столбцы Silverlight DataGrid во время выполнения (MVVM)

Какой лучший метод динамического указания столбцов DataGrid в элементе управления Silverlight DataGrid во время выполнения в соответствии с шаблоном MVVM?

Я бы хотел привязать свойство «DataGrid.Columns» к свойству в моей ViewModel, чтобы, если пользователь добавляет / удаляет столбцы, я просто обновляю свойство ViewModel, и DataGrid изменится. Проблема в том, что свойство DataGrid.Columns не может быть привязано (я не думаю).

Поскольку это свойство недоступно, а сам элемент управления DataGrid не доступен на уровне ViewModel, мой текущий подход заключается в том, чтобы выйти за пределы шаблона MVVM для этой конкретной реализации и зафиксировать определенные события в коде программной части View с использованием класса Messenger MVVM Light, а затем поговорите напрямую с элементом управления DataGrid для достижения этой возможности. Я знаю, что это общее утверждение этого подхода без деталей, но есть ли более простой способ ... или, может быть, не намного проще, но лучший способ, который немного лучше придерживается шаблона MVVM?

Меня сводит с ума, что свойство Columns элемента управления DataGrid не может быть привязано ... кажется такой простой вещью.

К вашему сведению - прежде чем будет предложено использовать AutoGenerateColumns = True, класс, привязанный к каждому элементу в коллекции, привязанной к DataGrid.ItemsSource, не имеет индивидуальных свойств для определения того, что привязано к столбцам ... это свойство коллекции, которое содержит столбцы, чтобы они оставались полностью динамичными, чтобы исключить конкретный путь. Кроме того, обработка AutoGeneratingColumns и использование e.Cancel для отображения / скрытия столбцов также сомнительны по той же причине (я думаю).


person Biggert    schedule 04.05.2010    source источник
comment
Поэтому сразу после публикации у меня в голове возникла идея ... было бы неплохо, если бы мой класс модели действовал как DataTable, где столбцы являются динамическими и могут быть добавлены / удалены по желанию, а это свойство (DataTable. Columns) распознается элементом управления DataGrid, когда AutoGenerateColumns = true, так что это обеспечивает динамические столбцы. Но вопрос в том, как я могу написать свой класс модели таким образом, чтобы его можно было интерпретировать таким образом элементом управления Silverlight DataGrid (кроме очевидного способа наследования от класса DataTable, чего я не хочу делать .. Я не думаю)?   -  person Biggert    schedule 05.05.2010
comment
Этот комментарий недействителен. В отличие от WPF, похоже, что Silverlight не имеет такой возможности.   -  person Biggert    schedule 05.05.2010


Ответы (1)


Я согласен с тем, что DataGrid.Columns не может быть привязан к этой боли. Моя рекомендация здесь - определить ваши столбцы в ViewModel в ObservableCollection. В представлении (код позади) обработайте событие CollectionChanged этого ObservableCollection и измените DataGrid.Columns в коде.

Хотя это решение менее элегантно, оно простое. Для вашей ViewModel вы можете модульно проверить, что событие CollectionChanged возникает правильно при добавлении, удалении или перемещении столбцов. Код просмотра не может быть протестирован, поэтому я думаю, вам нужно смириться с этим. Преимущество состоит в том, что, если когда-нибудь свойство DataGrid.Columns может быть привязано к базе данных, его будет легко реорганизовать, чтобы удалить код.

Другой способ (я думаю) - создать прикрепленное поведение или смешанное поведение, чтобы позаботиться об этом. Присоедините его к DataGrid; вместо того, чтобы напрямую связываться с DataGrid.Columns, привяжите к свойству поведения, и пусть поведение напрямую изменяет DataGrid (AssociatedObect).

Имеет ли это смысл? Ура, Лоран

person LBugnion    schedule 07.05.2010
comment
Решив реализовать свое первое предложение, которое, я согласен, менее элегантно, но выполняет свою работу, я наткнулся на альтернативный метод, который я тестирую. Подробное описание класса: goo.gl/DsO3 г-на Бодурова с использованием IL для динамического создания класса со свойствами, которые позволяет мне использовать DataGrid.AutoGenerateColumns = true и просто выполнять привязку прямо к коллекции с автоматическим отображением столбцов DataGrid ... так что мы потенциально можем привязаться прямо к ней в виртуальной машине. Это многообещающе, но есть несколько ошибок, которые я пытаюсь решить, касающиеся привязки, например распространения значений к модели. - person Biggert; 09.05.2010
comment
Звучит интересно, пожалуйста, напишите об этом в блоге, когда закончите, мне было бы интересно узнать о вашем опыте. - person LBugnion; 11.05.2010