2013-10-24 25 views
3

我在ClassA中有一個DependencyProperty。我從ClassA中派生出另一個ClassB。在ClassA中更新或更改此屬性的值時,如何在派生ClassB中通知或反映此類屬性,而無需在ClassA中添加任何其他代碼?WPF中的基類DependencyProperty值變化

回答

4

通過通過DependencyProperty.OverrideMetadata在派生類中註冊了一個ClassB的PropertyChangedCallback:

class ClassB 
{ 
    static ClassB() 
    { 
     ClassA.SomeValueProperty.OverrideMetadata(
      typeof(ClassB), new PropertyMetadata(SomeValuePropertyChanged); 
    } 

    private static SomeValuePropertyChanged(
     DependencyObject o, DependencyPropertyChangedArgs e) 
    { 
     ... 
    } 
} 
3

如果你想在你可以添加其他所有者兩個類被提出的財產變化。

using System.Windows; 

namespace dp 
{ 
    public class ClassA : DependencyObject 
    { 
     public string TestProperty 
     { 
      get { return (string)GetValue(TestPropertyProperty); } 
      set { SetValue(TestPropertyProperty, value); } 
     } 
     public static readonly DependencyProperty TestPropertyProperty = 
      DependencyProperty.Register("TestProperty", typeof(string), typeof(ClassA), new PropertyMetadata(null, new PropertyChangedCallback((s, e)=> 
       { 
       }))); 
    } 

    public class ClassB : ClassA 
    { 
     public ClassB() 
     { 
      TestPropertyProperty.AddOwner(typeof(ClassB), new PropertyMetadata((s, e) => 
       { 
       })); 
     }  
    } 

    public partial class MainWindow : Window 
    { 
     public ClassB TestClassB 
     { 
      get { return (ClassB)GetValue(TestClassBProperty); } 
      set { SetValue(TestClassBProperty, value); } 
     }   
     public static readonly DependencyProperty TestClassBProperty = 
      DependencyProperty.Register("TestClassB", typeof(ClassB), typeof(MainWindow), new PropertyMetadata(null)); 


     public MainWindow() 
     { 
      InitializeComponent(); 
      TestClassB = new ClassB(); 
      TestClassB.TestProperty = "test"; 
     } 
    } 
} 
-1
public class ClassA : DependencyObject 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    public string PropertyA 
    { 
     get { return (string)GetValue(PropertyAProperty); } 
     set { SetValue(PropertyAProperty, value); } 
    } 

    /// <summary> 
    /// Identifies the <see cref="PropertyA"/> dependency property. 
    /// </summary> 
    public static readonly DependencyProperty PropertyAProperty = 
    DependencyProperty.Register("PropertyA", typeof(string), typeof(ClassA), new PropertyMetadata("A")); 
} 


public class ClassB : ClassA 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    public string PropertyB 
    { 
     get { return (string)GetValue(PropertyBProperty); } 
     set { SetValue(PropertyBProperty, value); } 
    } 

    /// <summary> 
    /// Identifies the <see cref="PropertyB"/> dependency property. 
    /// </summary> 
    public static readonly DependencyProperty PropertyBProperty = 
    DependencyProperty.Register("PropertyB", typeof(string), typeof(ClassA), new PropertyMetadata("B")); 

    public ClassB() 
    { 
     ClassA.PropertyAProperty.OverrideMetadata(typeof(ClassB), new PropertyMetadata(AValuePropertyChanged)); 
    } 

    private static void AValuePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     MessageBox.Show(e.NewValue.ToString()); 
    } 
} 

public partial class MainWindow4 : Window 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    public MainWindow4() 
    { 
     InitializeComponent(); 

     this.Reference = new ClassB(); 
    } 

    private ClassB Reference { get; set; } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void Button_Click(object sender, RoutedEventArgs e) 
    { 



     this.Reference.PropertyA = "hello"; 
    } 
} 
相關問題