2010-10-13 80 views
3

我下一依賴性特性:依賴屬性如何工作?

public static DependencyProperty RequestObjectProperty = DependencyProperty.Register("RequestObject", typeof(RegistrationCardSearch), typeof(RegCardSearchForm),new UIPropertyMetadata(Changed)); 

    private static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     MessageBox.Show("Property Changed!!!"); 
    } 
    public RegistrationCardSearch RequestObject 
    { 
     get 
     { 
      return (RegistrationCardSearch)GetValue(RequestObjectProperty); 
     } 
     set 
     { 
      SetValue(RequestObjectProperty, value); 
     } 
    } 

和「改變」方法,有火的時候,我的依賴屬性的變化。我的屬性類型是RegistrashionCardSearch(類)。當我改變依賴屬性中的類的屬性值時,Property改變了回調而不是被觸發。爲什麼??我的RegistrashionCardSearch類實現INotifePropertyChanged接口

回答

1

Ronald已經很好地解釋了爲什麼你的方法是行不通的。要得到它的工作,您需要訂閱您的PropertyChanged事件RequestObject

private static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var form = (RegCardSearchForm)d; 

    if (e.OldValue != null) 
     ((RegistrationCardSearch)e.OldValue).PropertyChanged -= form.RequestObject_PropertyChanged; 
    if (e.NewValue != null) 
     ((RegistrationCardSearch)e.NewValue).PropertyChanged += form.RequestObject_PropertyChanged; 
} 

private void RequestObject_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    MessageBox.Show("Property " + e.PropertyName + " changed!"); 
} 
3

更改的事件僅在屬性本身更改時觸發,而不是在此屬性內更改值時觸發。給定將導致改變的事件火災的例子:

var requestObject = myObject.RequestObject; 
myObject.RequestObject = new RegistrationCardSearch() { ... }; 

改變的事件將觸發這個例子的最後一行,因爲物業本身的變化到另一個值。

但是,當你做這樣的事情:

myObject.RequestObject.SomeProperty = newPropertyValue; 

改變的事件將不會觸發,因爲你並沒有改變RequestObject屬性本身,只有屬性裏面的一些價值。