Уведомленное свойство не "обновлено" в пользовательском интерфейсе - PullRequest
0 голосов
/ 07 марта 2012

У меня есть модель, состоящая из трех классов: A, B и C. A имеет ObservableCollection of B, B имеет ObservableCollection of C. C имеет ссылку (ненаблюдаемый .. Я не думаю, что это необходимо) дляего родитель (B) и B имеют ссылку на A. Каждый атрибут A, B и C. уведомляет о своих изменениях.

Затем у меня есть класс Model, который "отслеживает" все выделенные объекты.Таким образом, он имеет ObservableCollection A, B и C (единственное, что требуется для As; я сохраняю списки для B и C только для более быстрой ссылки).

Мой пользовательский интерфейс имеет пользовательскийуправление: у него есть ViewModel.В представлении есть список.Его ItemSources привязан к его ViewModel к наблюдаемой коллекции с именем датчиков.Это ObservableCollection имеет RowViewModel.Каждый RowViewModel хранит ссылку на объект C.

Мое приложение загружает модель (создает объекты A, B, C), а затем устанавливает список представлений, вызывая этот метод (может, в этом проблема?)

public void setSensors(IList<C> list)
        {
            this.sensors.Clear();
            if (list != null)
            {
                foreach (var row in list)
                    this.sensors.Add(new RowViewModel(row));
            }
        }

Проблема в том, что, если я изменяю свойство моего объекта C, это не отражается на интерфейсе пользователя.

Кто-то может мне помочь?Спасибо

Francesco

РЕДАКТИРОВАТЬ: (решено) благодаря вашим ответам я проверил свой код и изменил одну вещь: вместо привязки моего элемента пользовательского интерфейса к его ViewModel (а viewModel просто «перенаправить»вызов свойства модели), я напрямую связываю пользовательский интерфейс с недвижимостью, и это работает !!Итак ... в MVVM я не могу использовать "ярлыки" ?? .. или, если я их использую, я должен зарегистрироваться для уведомления о свойстве и "распространять" их?

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Правила для модели для автоматического обновления пользовательского интерфейса: -

  1. Ваше свойство типа Collection должно иметь тип ObservableCollection
  2. Ваша модель должна реализовывать интерфейс INotifyPropertyChanged
  3. Каждое свойство вашей модели, если оно не является строковым или типом значения, должно иметь тип, который должен реализовывать INotifyPropertyChanged
  4. Если ваше значение Property типа Collection изменяется, оно должно вызывать PropertyChanged для имени свойства, даже если оно получено из ObservableCollection
1 голос
/ 07 марта 2012

Я думаю, что ваш пользовательский интерфейс не обновляется, потому что он привязан к RowViewModel объекту, а не к C. Итак, вы должны подписаться на PropertyChanged событие C в конструкторе RowViewModel и уведомлять об этих изменениях через RowViewModel.PropertyChanged. Кстати, можете ли вы привести пример привязки в вашем пользовательском интерфейсе?

ОБНОВЛЕНИЕ:

Пример "проксирования" PropertyChanged событие:

public class Model: INotifyPropertyChanged
{
  private string _YourProperty;
  public string YourProperty
  {
    get { return _YourProperty; }
    set
    {
      if (_YourProperty == value) return;
      _YourProperty = value;
      RaisePropertyChanged("YourProperty");
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;

  private void RaisePropertyChanged(string propertyName)
  {
    if (PropertyChanged != null)
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }
}

public class ViewModel: INotifyPropertyChanged
{
  private Model _Model;

  public ViewModel(Model model)
  {
    _Model = model;
    _Model.PropertyChanged += OnModelPropertyChanged;
  }

  public string YourProperty
  {
    get { return _Model.YourProperty; }
  }

  private void OnModelPropertyChanged(object sender, PropertyChangedEventArgs e)
  {
    if (e.PropertyName == "YourProperty")
      RaisePropertyChanged("YourProperty");
  }

  public event PropertyChangedEventHandler PropertyChanged;

  private void RaisePropertyChanged(string propertyName)
  {
    if (PropertyChanged != null)
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }
}

Вы также можете прочитать http://george.softumus.com/2011/10/inotifypropertychanged-and-magic.html - как избежать использования "магических строк" (жестко закодированных констант) в качестве имен свойств.

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