6

ClassA に DependencyProperty があります。ClassA から別の ClassB を派生させました。このプロパティの値が ClassA で更新または変更された場合、 ClassA にコードを追加せずに派生 ClassB に通知または反映するにはどうすればよいですか?

4

4 に答える 4

6

派生クラスでDependencyProperty.OverrideMetadataを介して ClassB の PropertyChangedCallback を登録することにより:

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

    private static SomeValuePropertyChanged(
        DependencyObject o, DependencyPropertyChangedArgs e)
    {
        ...
    }
}
于 2013-10-24T08:11:27.547 に答える
5

プロパティの変更を両方のクラスで発生させたい場合は、別の所有者を追加できます。

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
    {
        static 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";
        }
    }
}
于 2013-10-24T08:14:40.370 に答える
0

コメント: クラス B のインスタンスを 2 つ使用すると、エラーが発生します

  • _innerException {"PropertyMetadata は型 'ClassB' に対して既に登録されています。"} System.Exception {System.ArgumentException}
于 2020-01-16T09:01:59.540 に答える
-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";
    }
}
于 2013-10-24T08:22:24.580 に答える