Я пытаюсь использовать MVVM впервые. У меня есть приложение для Windows Phone (Mango), в котором есть класс модели, класс модели представления и страница представления xaml. У меня есть элементы управления (текстовые поля), связанные с виртуальной машиной, а виртуальная машина связана с моделью.
И модель, и модель представления реализуют INotifyPropertyChanged
. Реализация, которую я использую, скопирована, чтобы я мог попытаться выяснить, что я делаю с INPC. Вот код, который указан в обоих классах:
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
У меня есть одно свойство в классе Model, которое можно установить вручную (из текстового поля) или рассчитать (изменив одно из других свойств). Давайте назовем это одним результатом.
Если я изменяю одно из других свойств и перехожу, INPC вызывается как в измененном свойстве, так и в пересчитанном свойстве в классе Model, хотя PropertyChanged
равно null
, поэтому часть кода пропускается , Затем в виртуальной машине измененное свойство проходит через INPC этого класса (как часть метода доступа set), и на этот раз PropertyChanged
не является null
, поэтому вызывается метод PropertyChanged
. Однако для свойства Result
INPC не вызывается (в этом свойстве INPC не вызывается средством доступа set другого свойства).
Вот одно из свойств в Модели, которое не является вычисляемым свойством:
public int AgeSetting
{
get
{
return (int)GetValueOrDefault(AgeSettingKeyName, AgeSettingDefault);
}
set
{
AddOrUpdateValue(AgeSettingKeyName, value);
Calculate();
}
}
Вот свойство Расчетного значения в Модели.
public int PointsSetting
{
get
{
return (int)GetValueOrDefault(PointsSettingKeyName, PointsSettingDefault);
}
set
{
AddOrUpdateValue(PointsSettingKeyName, value);
}
}
Из ViewModel, здесь оба свойства:
public int Age
{
get
{
return person.AgeSetting;
}
set
{
person.AgeSetting = value;
NotifyPropertyChanged("Age");
}
}
public int PointsAllowed
{
get
{
return person.PointsSetting;
}
set
{
person.PointsSetting = value;
NotifyPropertyChanged("PointsAllowed");
}
}
Никогда прежде этого не делал, я ожидал, что INPC должен вырасти из класса модели, в класс VM, в интерфейс пользователя. Похоже, что это не работает.
Я знаю, что свойство Result (рассчитывается) изменяется, так как я могу уйти со страницы и вернуться, и вновь отображаемое значение является правильным. Я просто не знаю, как перейти от вычисленного значения в модели к модели представления и до представления.
Спасибо за любые предложения.