MVVM Как разработать модель представления для таблицы данных, столбцы которой выбираются пользователем - PullRequest
4 голосов
/ 11 октября 2010

Так что, когда у меня есть Datagrid, который я хочу заполнить данными из моей базы данных.Я обычно проектирую ViewModel с данными, которые я хотел отобразить.Но как мне создать ViewModel для моей таблицы данных, когда я не знаю, какие данные будут отображаться в нем?

Поэтому, когда я позволяю пользователю моего приложения указывать столбцы из таблицы базы данных, которые он хочетотобразить в Datagrid.Как мне спроектировать ViewModel для этого случая?

Так что я надеюсь, что ясно, что я хочу сделать.

спасибо заранее

Ответы [ 3 ]

2 голосов
/ 11 октября 2010

Ранее я делал это следующим образом:

  • используется документ XML, который описывает все доступные столбцы, их форматирование (т. Е. "# 0. # 0" для числовогостолбцы), а также поле данных, с которым они связаны, он также описывает, какие столбцы являются столбцами по умолчанию

  • это описание столбца XML извлекается через вызов WCF серверу (это был Silverlightproject)

  • столбцы сетки генерируются представлением с использованием фабрики столбцов сетки (это выполняется представлением, поскольку оно сильно зависит от пользовательского интерфейса).Столбцы по умолчанию установлены на видимые, остальные на невидимые

  • ViewModel заполняется списком объектов данных, содержащих все данные для столбцов

  • пользователь может щелкнуть правой кнопкой мыши по сетке и через контекстное меню вызвать диалоговое окно, содержащее полный список столбцов, с галочкой (галочкой) рядом с теми, которые в данный момент видны.Этот диалог управляется / заполняется из View - поскольку ViewModel не должна ничего знать о реальном UI.Вы можете использовать диалоговую службу для этого.Виртуальная машина диалога заполняется списком анонимных объектов, содержащих заголовки столбцов и состояние видимости столбца.

  • при закрытии диалогового окна пользователем в представлении отображаются / скрываются соответствующие столбцы.(я пошел еще дальше - когда пользователь проверяет столбец в диалоговом окне, он мгновенно становится видимым в сетке, так что пользователь знает, что он выбрал правильный, при отображении многих десятков столбцов довольно многие могут быть очень похожими). ​​

Преимущество использования XML-документа для описания столбцов:

  • это независимость от пользовательского интерфейса;не имеет значения, какой компонент сетки я использую, все, что мне нужно сделать, это изменить фабрику

  • XML-документ может быть обновлен отдельно в коде;если клиент хочет изменить форматную строку, мне не нужно перекомпилировать код.Точно так же, если мне нужно будет показывать больше данных в будущем, все, что мне нужно изменить, это мой XML-документ, сборка, содержащая определения объектов данных, и сборка DAL - V / VM вообще не нужно менять.

2 голосов
/ 11 октября 2010

На ум приходят два решения.

  1. Пусть ViewModel удерживает все столбцы и просто выбирает выбранные пользователем в представлении.Это не идеально.

  2. Используйте отражение в данных вида, чтобы определить столбцы для модели представления.

0 голосов
/ 11 октября 2010

Вам даже нужно создать модель вида? Разве вы не можете просто заполнить локальный DataTable и привязать DataGrid к нему? Огромное количество функциональности встроено в объекты ADO, и DataGrid взаимодействует со многими из них. Если вам действительно нужны дополнительные свойства для DataRow (например, такие как команды), вы можете создать подкласс DataTable и DataRow и добавить их. Это может сэкономить вам много работы.

Независимо от того, создаете ли вы DataTable или создаете свой собственный класс, достаточно простой подход - установить AutoGenerateColumns в true и обработать событие DataGrid.AutoGeneratingColumn. Вы можете подключить список столбцов, которые вы хотите скрыть, а затем установить e.Cancel в значение true, когда генерируемый столбец находится в этом списке. В документации показан пример того, как это выглядит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...