Динамически указывать и изменять столбцы Silverlight DataGrid во время выполнения (MVVM) - PullRequest
2 голосов
/ 05 мая 2010

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

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

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

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

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

1 Ответ

1 голос
/ 07 мая 2010

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

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

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

Это имеет смысл? Ура, Laurent

...