2012-05-15 4 views
0

Я пытаюсь выяснить, как вызвать PropertyChangedEvent, когда меняется средний слой моего привязки. Начну с примера здесь:MVVM Привязка к свойствам наблюдаемого свойства

public class MainViewModel :NotificationObject // Main DataContext 
{ 
    public SubViewModel SubVM{get; {_subVM = value; RaisePropertyChanged("SubVM");}} // observable property 
    public void DoChangeSubVM() 
    { 
     SubVM = new SubViewModel(); // doing this will not update the egControl 
    } 
} 

public class SubViewModel : NotificationObject 
{ 
    public Sub2ViewModel Sub2VM {get; set{_sub2VM = value; RaisePropertyChanged("Sub2VM");}} // observable property 
} 

public class Sub2ViewModel : NotificationObject 
{ 
    public int SomeProp {get; set {_someProp = value; RaisePropertyChanged("SomeProp");} // observable property 
} 

в XAML:

<EgControl name="egControl" Content={Binding SubVM.Sub2VM.SomeProp} /> 

Теперь, если изменить Sub2VM свойство по egControl не автомагически обновляется со значением SomeProp нового экземпляра Sub2VM , Как кто-то добивается этого, без необходимости вручную поднять все события, измененные в Sub2ViewModel, из набора свойств Sub2VM?

Использование: Prism .NET 4.0

+1

Значение должно быть изменено. Вы, вероятно, делаете что-то не так, но вам нечего говорить, если вы не публикуете свой фактический код. –

+0

Вы правы. Он делает это по умолчанию.У меня был код, в котором наблюдаемое свойство имеет доступ к другому оператору в дочернем объекте (отличном от вопроса, который я разместил). Я исправил его, подписавшись на свойство дочернего объекта и изменив событие изменения основного свойства. Благодаря! – LadderLogic

ответ

0

Хорошо, не уверен, Prism, но, вообще говоря, все три класса должны быть реализации уведомления об изменении свойства. Упрощенный способ сделать это с помощью функции INotifyPropertyChanged. Так SubViewModel должен быть больше как:

public class SubViewModel : INotifyPropertyChanged 
{ 
    private Sub2ViewModel sub2vm; 
    public Sub2ViewModel Sub2VM 
    { 
     get 
     { 
      return sub2vm; 
     } 
     set 
     { 
      sub2vm = value; 
      OnPropertyChanged("Sub2VM"); 
     } 
    } 

    protected void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
} 

без уведомления об изменении свойства, интерфейс не знает, когда udpate связанного свойства.

+0

Все эти классы наследуют от NotificationObject, который реализует объект INotifyPropertyChanged. Я обновлю пример, чтобы быть более конкретным – LadderLogic

0

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

Ответ

У вас есть несколько возможностей:

Raise все имущество изменили события в инкубаторе, которые вы сказали, что вы хотели бы избежать. Но это правильная стратегия для рассмотрения. Если вы знаете, какие свойства зависят от результатов другого, тогда им нужно будет повысить свойство, измененное в сеттер для многих свойств.

public class myViewModel 
{ 
    private string _FirstName 
    public string FirstName 
    { 
     get { return_FirstName }; 
     set 
     { 
      _FirstName = value; 
      RaisePropertyChanged("FirstName"); 
      RaisePropertyChanged("FullName"); 
     } 
    } 
} 

Поднять все измененные свойства, произошедшие в методе, после создания новой модели ViewModel.

public class myViewModel 
{ 
    private string _FirstName 
    public string FirstName 
    { 
     get { return_FirstName }; 
     set 
     { 
      _FirstName = value; 
      RaisePropertyChanged("FirstName"); 
     } 
    } 

    public void UpdateFirstName(string firstName) 
    { 
     _FirstName = firstName; 
     RaisePropertyChanged("FirstName"); 
     RaisePropertyChanged("FullName"); 
    } 
} 

Используйте сеттеры для установки некоторых свойств, тем самым вызывая уже существующее событие, изменившее свойство.

public class myViewModel 
{ 
    private string _FirstName 
    public string FirstName 
    { 
     get { return_FirstName }; 
     set 
     { 
      _FirstName = value; 
      RaisePropertyChanged("FirstName"); 
     } 
    } 

    public Person ClonePerson(Person rootPerson) 
    { 
     Person clone = new Person() 
     { 
      FirstName = rootPerson.FirstName; 
      LastName = rootPerson.LastName; 
     } 
     return clone; 
    } 
} 

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

public class myViewModel 
{ 
    private string _FirstName 
    public string FirstName 
    { 
     get { return_FirstName }; 
     set 
     { 
      _FirstName = value; 
      this.RaiseAllPropertyChanges(); 
     } 
    } 

    public void RaiseAllPropertyChanges() 
    { 
     RaisePropertyChanged("FirstName"); 
     RaisePropertyChanged("FullName"); 
    } 
} 

Конечный результат заключается в следующем: Для любого связанного элемента пользовательского интерфейса, чтобы знать, что он должен обновить свойство измененного событие для этого свойства должно быть поднято.

0

Один из способов сделать это - создать конструктор для SubViewModel и Sub2ViewModel, который инициализирует все свойства некоторым значением по умолчанию. Это обеспечит инициализацию ваших свойств и даст вам возможность установить начальные значения.

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