2010-10-06 75 views
0

我創建了兩個viewmodel,MyViewModel,MyViewModel2。 MyViewModel2包含MyViewModel作爲屬性。 MyViewModel包含EF/WCF Ria服務中的一個實體MyEntity。如何從ViewModel捕獲PropertyChanged事件?

在MyViewModel2中,我想捕獲MyEntity中的任何項目更改以進行數據綁定。我的代碼如下圖所示:

public class MyViewModel : ViewModelBase 
{ 
     //.... 
     public MyViewModel(myEntity myEntity) 
      : this() 
     { 
      //.... 
      this._myEntity = myEntity; 
      this._myEntity.PropertyChanged += new PropertyChangedEventHandler(_myEntity_PropertyChanged); 
      this.RaisePropertyChanged("MyEntity"); 
     } 

     void _myEntity_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     {     
      this.RaisePropertyChanged("MyEntity");    
     } 

    private MyEntity _myEntity; 
     public MyEntity MyEntity 
     { 
      get { return this._myEntity; } 
      set 
      { 
       if (value != this._myEntity) 
       { 
        this._myEntity = value; 
        RaisePropertyChanged("MyEntity"); 
       } 
      } 
     } 
} 


public class MyViewModel2 : ViewModelBase 
{  
     public MyViewModel2(){ 
     this._MyViewModel = new MyViewModel(); 
     this._MyViewModel.PropertyChanged += new PropertyChangedEventHandler(_MyViewModel_PropertyChanged); 
     } 

     void _MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      //do something here.... 
     } 


     private MyViewModel _MyViewModel; 
     public MyViewModel MyViewModel 
     { 
      get { return this._MyViewModel; } 
      set 
      { 
       if (value != this._MyViewModel) 
       { 
        this._MyViewModel = value; 
        RaisePropertyChanged("MyViewModel"); 
       } 
      } 
     } 
} 

然後我運行應用程序,並在myEntity所改變的數據,但我不能捕捉MyViewModel2改變的事件。

如何解決此問題?

回答

0

您是否正在更改myViewModel._myEntity或myViewModel._myEntity.SomeProperty的值?

在您提供的代碼中,MyViewModel僅在字段'_myEntity'的值發生改變時才引發PropertyChanged事件,而不是'_myEntity'實例的值被更改。

要適當提高的PropertyChange通知上_myEntity,你應該添加PropertyChanged事件調用代碼myEntity所的屬性setter之下,諸如此類:

public class MyEntity 
{ 
    private string _name; 
    public string Name 
    { 
     get 
     { 
      return this._name; 
     } 
     set 
     { 
      if(value != this._name) 
      { 
        this._name = vaule; 
        this.RaisePropertyChanged("Name"); 
      } 
     } 
}