2015-04-09 2 views
0

Я изо всех сил пытаюсь реализовать шаблон MVVM в моем текущем проекте.Как обновить модель и просмотреть модель в шаблоне MVVM?

«ClassA» непрерывно получает требуемые данные с удаленного устройства и сохраняет эти данные внутри своих полей. Я думаю, это модель. Обновления ClassA нуждаются в информации с помощью метода Update.

«ClassB» непрерывно получает данные из «ClassA» и сохраняет его в соответствующих свойствах. Похоже, это модель взгляда.

View - это простой MainWindow.xaml с DataGrid внутри.

У меня есть следующие вопросы:

1) Как обновить ViewModel? Должен ли ClassB использовать метод Update, который принимает экземпляр ClassA и обновляет соответствующие поля?

2) Где хранить экземпляр ClassA? Должен ли ClassA быть полем ClassB? Если это так, то как мне обновить модель? Я думал, что-то вроде следующего:

public void UpdateB() 
{ 
    ClassA.UpdateA(); 
    this.FieldOne = ClassA.FieldOne; 
    this.FieldTwo = ClassA.FieldTwo; 
} 

4) Есть ли у модели есть это метод обновления на все модели или просто хранит данные?

3) Что мне делать внутри MainWindow.cs, кроме инициализации окон? Могу ли я обновить модель просмотра (ClassB)?

+2

Вы должны реализовать интерфейс 'INotifyPropertyChanged' для класса ClassB (для модели представления) и установить' ClassB' как 'DataContext' для MainWindow (из кода позади или из xaml). Затем вам нужно связать элементы пользовательского интерфейса, чтобы просмотреть поля модели и заполнить эти поля. Вы можете найти множество простых примеров реализации шаблона MVVM. –

ответ

1

Я считаю, что лучше всего иметь объект, представляющий элемент в каждом слое абстракции. Это включает в себя форму данных, которые существуют на диске. Помните, что в MVVM единственная реальная цель - способствовать ослаблению связи между интерфейсом (User Interface) и внедрением (ViewModel functionality).

Например, если у меня есть объекты, хранящиеся в файлах XML, у меня будет объект на моем уровне доступа к данным, который существует только для правильного управления данными XML. Назовем это ObjectXml. Этот объект содержит только данные в форме, которая является родной для данных на диске. В этом случае все данные имеют строковое представление, как в файлах XML.

В слое модели у вас будет представление данных XML-файла в ожидаемых типах данных. Назовем это Object. Получатели и сеттеры свойств могут получить доступ и установить строковое представление данных, выполнив преобразования в обоих направлениях. Таким образом, данные готовы к сохранению источника данных (файл xml, база данных и т. Д.).

В ObjectViewModel, свойства могут получить доступ к ним в Object. Модель просмотра содержит все элементы для представления и изменения модели.

Обратите внимание, что ObjectXml действительно полезно только в том случае, когда вам разрешено хранить только строковые данные или когда подходящей схемы не существует для ваших типов данных.

В конце концов, у вас есть иерархия сдерживания таких, как показано ниже:

public class ObjectXml 
{ 
    [XmlArray("People"), XmlArrayItem("Person")] 
    public List<PersonXml> People { get; set; } 
    //PersonXml is an xml data model similar to this one 

    [XmlElement("Item")] 
    public string Items { get; set; } 
} 

Вот модель для объекта Xml:

public class Object 
{ 
    private ObjectXml _xmlContext; 

    public Object(ObjectXml xmlContext) 
    { 
     this._xmlContext = xmlContext; 
    } 

    public List<Person> People 
    { 
     get 
     { 
      //Person requires a constructor that takes a PersonXml object in order for this to work properly 
      return this._xmlContext.People.Select(x => new Person(x)).ToList(); 
     } 
     set 
     { 
      this._xmlContext.People = value.Select(x => new PersonXml(x)).ToList(); 
     } 
    } 

    public double Item 
    { 
     get { return double.Parse(this._xmlContext.Item); } 
     set { this._xmlContext.Item = value.ToString(); } 
    } 
} 

Очевидно, что это не разумно имени ваш объект класса, поскольку это зарезервированное слово в C#. Надеюсь, я дал вам некоторые идеи о том, как получить доступ и обновить данные в надежной и расширяемой форме.

Одним словом, вам не нужен метод обновления вообще. Кроме того, за исключением констант и полей поддержки свойств, существует очень мало причин, по которым требуется прямой доступ к полям в C# MVVM.

  1. См. Ниже. Не слушайте людей, которые говорят, что ViewModel и Model необходимо развязать. Основная цель модели - промежуточный уровень, который подготавливает данные для сохранения или загрузки в программу и хранения данных способом, который не зависит от данных и функциональности программы (ViewModel)
  2. Вам не требуется метод обновления. Используйте свойства, которые обращаются к модели данных и сохраняются в хранилище данных (xml, database etc.), если необходимо.
  3. Вам не нужен метод обновления.
  4. Вам не нужно ничего делать внутри ViewModel.cs. Только код, который изменяет представление, должен быть в коде. Единственный ViewModel, который вы должны получить в представлении, - это тот, который следует за формой MainWindowViewModel, которая больше похожа на ApplicationViewModel, которая содержит экземпляры других необходимых режимов просмотра.

Наконец, не застревают с использованием усложненной MVVM "framework" как большая часть функциональности не является полезным или необходимым.

+0

Похоже, я наконец понял. Спасибо вам. – CorellianAle

0

Как указано в комментарии Yuris, вы не должны использовать какой-либо метод обновления, а скорее реализуете интерфейс INotifyPropertyChanged. Как и имя, это говорит об уведомлении всех подписчиков, когда значение определенного свойства изменилось.

This - хорошая статья, содержащая код для минималистической реализации MVVM. Если у вас возникли проблемы с реализацией шаблона с нуля, попробуйте начать с этого примера и замените существующие классы на свой собственный один за другим.

Что касается механика обновления внутри вашего MainWindow.cs - вам не нужны, если вы укажете DataBinding в своем коде xaml, как это сделано в примере, приведенном выше.

Надеюсь, это поможет вам начать работу!

+0

Эта статья очень помогла. Благодарю. – CorellianAle

+0

Я рад слышать это :) –

Смежные вопросы