Как создать ViewModel для многих представлений, совместно использующих одну и ту же модель? - PullRequest
2 голосов
/ 20 июля 2011

Это основано на примере из книги: Pro WPF и Silverlight MVVM Гэри Маклина Холла

, где автор только настаивает на том, как создать модель для структуры БД (и как реализовать DALдля него).

Я ищу правильный способ создания ViewModel (s).

Вот модель базы данных и модель MVVM - я подозреваю этоне совсем завершен, но в Product отсутствует код продукта:

Моими представлениями будут: Страницы, отображающие / редактирующие представления для продуктов, клиентов и заказов. Я знаком с моделями / моделями представления, реализующими / использующими INotifyPropertyChange и ObservableCollectionНе нужно на этом настаивать.

Мои вопросы:

  1. Как создать ViewModels таким образом, чтобы они все использовали одну и ту же модель
  2. Какмне управлять ViewModels?Есть ли у меня одна основная ViewModel, которая объединяет все конкретные?Это относится к сохранению и восстановлению состояния ViewModel.

Меня особенно интересует, как справиться с этим : модель заказа имеет список продуктов.Мне также придется вести список продуктов для моей модели ProductsViewModel, которая поддерживает отображение / редактирование видов для продуктов.Как все можно синхронизировать?Должен ли OrderModel иметь только список ProductCodes вместо этого?Каковы последствия в этом случае?

В общем, вот что мне нужно здесь: как создавать и управлять моделями представления для моделей, которые реализуют таблицы БД со многими отношениями (например, Product-Заказы) .Используем ли мы только внешние ключи как часть объектов Model или используем ссылку на целый другой объект Model, представленный этим внешним ключом?

1 Ответ

1 голос
/ 20 июля 2011

Для меня это звучит так, будто вы думаете об этом неправильно.Когда вы спрашиваете «Как создавать ViewModels и управлять ими для моделей, которые реализуют таблицы БД с множеством взаимосвязей», звучит так, как будто вы думаете о ViewModel в терминах моделей.Что не правильно.ViewModel - это модель View, а не Model.Вы не должны думать о создании ViewModel для ваших моделей, вы должны думать о создании VewModel из ваших Views.

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

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

Model                SummaryViewModel       DetailsViewModel
-----                ---------------        ----------------
RecipientAddress                            RecipientAddress
SenderAddress        SenderAddress          SenderAddress
Subject              Subject                Subject
Content                                     Content

Теперь сводное представление является только сводкой и не отображает RecipientAddress илиСодержимое, следовательно, эти свойства не существуют в SummaryViewModel.Подробное представление отображает больше информации, поэтому имеет больше свойств.Эта же идея отвечает на ваш вопрос о внешних ключах.Внешние ключи никогда не отображаются в вашем представлении, поэтому вы не должны быть членами вашей модели представления.Ваша ViewModel заботится только о том, что требуется для View.

В ответ на ваш вопрос «как вы управляете моделями представления»: вы этого не делаете.Вам не нужно.Экземпляры ViewModel обычно (не всегда) имеют отношение один к одному с представлениями, поэтому вам не нужно управлять ими.Они живут только до тех пор, пока живет вид.Вы просто создаете новый экземпляр ViewModel при загрузке представления (обычно в обработчике события OnNavigatedTo, см. Ниже) и сохраняете его в DataContext представления.Если загружены два экземпляра представления, то существует две модели представления.Когда View является GC'ом, ViewModel тоже (если у вас нет утечки памяти).

Наконец, что касается того, как вы должны синхронизировать изменения, это может быть сложно в настольном приложении Silverlightгде многие виды могут отображаться одновременно.К счастью, на Windows Phone у нас обычно только один открытый вид (хотя и не всегда).Таким образом, мы можем просто сказать нашей ViewModel обновлять каждый раз, когда на страницу переходят:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    if (DataContext == null)
         DataContent = new MyViewModel();  //Create new instance of the ViewModel
    else
         (MyViewModel)DataContext.Refresh();  //Refresh the existing ViewModel
}

В большинстве случаев это работает хорошо, для более сложных сценариев вы можете посмотреть на инфраструктуру обмена сообщениями, предоставляемую инструментарием, таким как Prism илиMvvmLight.

Надеюсь, это помогло.

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