Повышение INotifyPropertyChanged для всех членов класса / структуры? - PullRequest
2 голосов
/ 13 января 2011

Итак, у меня есть проект, настроенный так:

Class Dataclass
{
  var data
  var data;
  var data;
 }

class DataViewModel
{
   private Dataclass thing;

   public string thingPropertyName = "thing";
   public Dataclass Thing
   {
     get { return thing; }
     set { thing = value; RaisedPropertyChanged(thingPropertyName);}
   }
 }

Так вот в чем моя проблема: если я связываюсь с подпрепаратом через поле Thing в моем классе ModelView, привязки не обновляются, еслилюбой из членов класса изменится, только если весь объект изменился, как я полагаю, намеренно.

Как я могу обойти это, чтобы, если я что-то сделал с членами содержимого Dataclass,мои привязки обновляются правильно?

Первое, на что я обратил внимание, - это оборачивал каждый элемент подкласса в свойство родительского класса, например так:

public var Data
{
   get { return thing.Data; }
   set { thing.Data = value; RaisePropertyChanged(DataProperyName);}
}

Это работает,однако у меня все еще есть проблема, когда объект подкласса инициализируется.Единственное решение, которое я вижу, это вручную вызывать RaisedPropertyName () для каждого элемента при инициализации класса.Это выглядит как неоптимальный способ сделать это.Я надеялся, что будет лучший подход.Спасибо.

Ответы [ 2 ]

4 голосов
/ 13 января 2011

В большинстве случаев вызов RaisePropertyChanged(null) (при условии, что это в конечном итоге вызывает вызов соответствующего делегата события INotifyPropertyChanged с нулевым параметром имени свойства в структуре args) сообщит всем связанным слушателям обновить.

3 голосов
/ 13 января 2011

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

Если вы не хотите, чтобы DataClass реализовывал INotifyPropertyChanged по причинам «слоев» (например: вы не хотите, чтобы ваши классы данных реализовывали проблемы, связанные с представлениями), тогда ваш DataViewModel должен действовать как проход для каждого собственность, которая вам нужна. Это второе решение, которое вы предлагаете.

...