Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

MVVM - как представляются вложенные классы?

9.7K
25 октября 2011 года
Vitamant
228 / / 07.02.2011
Доброго времени суток!
Начал новый проект на WPF/C# и решил сделать на этот раз всё "как у людей". Почитал про MVVM, посокрушался, что сам до подобного не додумался, нахватался теории и приступил... Сюрприз ждал уже на второй модели представления.
В простейшем случае, имеем связку:
Код:
public class Data
{
  public string MyString;
}

public class DataViewModel : ViewModelBase
{
  protected readonly model;

  public DataViewModel()
  {
    model = new Data();
  }

  public string MyString
  {
    get { return model.MyString; }
    set
    {
      model.MyString = value;
      RisePropertyChanged("MyString");
    }
  }
}


Пользуюсь набором MVVMLight, в ViewModelBase нет никакой магии - реализован интерфейс INotifyPropertie и метод RisePropertyChanged.

Все просто, все понятно. Теперь возникла следующая ситуация. Класс Data используется не напрямую а в модели другого класса:
 
Код:
public calss MultiData
{
    public Data Data1;
    public Data Data2;
    public Data Data3;
}


Как в этом случае должна выглядеть модель представления? Я не могу в MultiData использовать DataModelView - модель не должна знать ничего об окружающем мире. Остается второй вариант - у MultiData нет модели, есть лишь модель представления. Допустим. Однако, если я добавлю еще какое-нибудь поле. Например:

 
Код:
public calss MultiDataModelView
{
    public DataViewModel Data1;
    public DataViewModel Data2;
    public DataViewModel Data3;

    public int Count;
}

Это уже будет неправильно - окажется, что модель представления выполняет роль модели!

Что делать? Как быть? Отказ от использования MVVM не предлагать (разве что с адекватной альтернативой, коих, кажется, нет) - мне действительно понравился этот паттерн. Если хотя бы половина из описанных достоинств верна - следование ему действительно на порядок облегчит сопровождение кода.


Второй вопрос - что говорит MVVM о синглтонах? Положим, что я знаю, что делаю, и мне действительно нужен синглтон, а не фабрика объектов, он будет единственным от начала дней и до конца вселенной. Следует ли и ему создавать модель представления? Опять же - как?

Спасибо за внимание, очень надеюсь на вашу помощь!:)
9.7K
19 ноября 2011 года
Vitamant
228 / / 07.02.2011
Проблема решена. Все оказалось очень просто.
Все экземпляры моделей вкладываются в модели.
Все экземпляры моделей представления вкладываются в модели представления.
При этом конструктор модели представления (если ей это нужно, конечно) принимает в качестве аргумента ссылку на модель и устанавливает ее (не надо специально указывать ref для классов - они и так передаются по ссылке, я акцентирую на этом внимание лишь для того, чтобы вы осознали [кто не осознал], что будет передана именно ссылка на модель, а не создан ее клон). По ссылке может быть передана любая модель сколь угодно вложенная.
Таким образом будут существовать две параллельные ветки: ветвь моделей и моделей представления, при этом каждая из вложенных моделей будет держать ссылки на соответствующий уровень моделей.

Объяснил конечно путано и страшно, но если вдруг кому-то сие понадобится и он не разберет мой бред - пишите, объясню на пальцах с примерами кода.
74K
13 декабря 2011 года
Serdceder
6 / / 16.09.2011
Здравствуйте.
Я как раз пытаюсь разобраться с MVVM. Если вам не сложно могли бы вы указать ошибку (или ошибки) согласно созданной мной теме. Я всегда стараюсь разобраться сам, но эта проблема, как камень Сизифа, тянется за мной уже почти год. На форуме msdn понимал подобный вопрос нескоьлко раз, но всё безрезультатно.
Тема создана на этом форуме. Вот ссылка - http://forum.codenet.ru/threads/69335-MVVM.-%D0%9D%D0%B5-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%B2%D0%BE-%D0%B2%D0%B0-%D0%BE%D0%B1%D1%8A%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B2-%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85-%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0%D1%85?p=363187#post363187
Заранее благодарен.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог