Я считаю, что лучше всего иметь объект, представляющий элемент в каждом слое абстракции. Это включает в себя форму данных, которые существуют на диске. Помните, что в 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.
- См. Ниже. Не слушайте людей, которые говорят, что
ViewModel
и Model
необходимо развязать. Основная цель модели - промежуточный уровень, который подготавливает данные для сохранения или загрузки в программу и хранения данных способом, который не зависит от данных и функциональности программы (ViewModel
)
- Вам не требуется метод обновления. Используйте свойства, которые обращаются к модели данных и сохраняются в хранилище данных (
xml, database etc.
), если необходимо.
- Вам не нужен метод обновления.
- Вам не нужно ничего делать внутри
ViewModel.cs
. Только код, который изменяет представление, должен быть в коде. Единственный ViewModel
, который вы должны получить в представлении, - это тот, который следует за формой MainWindowViewModel
, которая больше похожа на ApplicationViewModel
, которая содержит экземпляры других необходимых режимов просмотра.
Наконец, не застревают с использованием усложненной MVVM "framework"
как большая часть функциональности не является полезным или необходимым.
Вы должны реализовать интерфейс 'INotifyPropertyChanged' для класса ClassB (для модели представления) и установить' ClassB' как 'DataContext' для MainWindow (из кода позади или из xaml). Затем вам нужно связать элементы пользовательского интерфейса, чтобы просмотреть поля модели и заполнить эти поля. Вы можете найти множество простых примеров реализации шаблона MVVM. –