在两个类之间共享 C# (WPF) 中的依赖属性

Boe*_*ern 0 c# wpf dependency-properties

我想要两个共享一个DepedencyProperty类使用AddOwner(欢迎任何其他方法),例如

class ClassA : DependencyObject
{
    public int Number
    {
        get { return (int)GetValue(NumberProperty); }
        set { SetValue(NumberProperty, value); }
    }

    public static readonly DependencyProperty NumberProperty =
        DependencyProperty.Register("Number", typeof(int), typeof(ClassA),
             new FrameworkPropertyMetadata(0,
                 FrameworkPropertyMetadataOptions.Inherits));
}
Run Code Online (Sandbox Code Playgroud)

class ClassB : DependencyObject
{
    public int Number
    {
        get { return (int)GetValue(NumberProperty); }
        set { SetValue(NumberProperty, value); }
    }

        public static readonly DependencyProperty NumberProperty =
        ClassA.NumberProperty.AddOwner(typeof(ClassB),
        new FrameworkPropertyMetadata(0,
            FrameworkPropertyMetadataOptions.Inherits));
}
Run Code Online (Sandbox Code Playgroud)

就像这里描述的那样。正如您可能猜到的那样:当然它不起作用。这是完全有道理的,因为不可能创建同一个类的多个实例,而这些实例都具有“自己的”依赖属性。

我如何确保所有类(特别是所有实例)的ClassAClassB它指的是财产和其他类都在谈论完全相同的性质(因此价值)?甲辛格尔顿是没有选择,因为Class AMainWindowClass B是一个UserControl(因此保护构造是不可能的)。

问候,本

Rac*_*hel 5

我认为您误解了 DependencyProperties 的目的。

它们基本上是一个属性定义,没有属性

它们定义了名称、类型、默认值、值的位置等内容,但它们不包含实际值本身。这允许为值提供指向任何其他位置的任何其他属性的绑定。

最好的办法是创建一个由单例属性支持的属性。

public int Number 
{
    get { return MySingleton.Number; }
    set { MySingleton.Number = value; }
}
Run Code Online (Sandbox Code Playgroud)

编辑

根据下面的评论,您说您希望对象的所有实例响应来自任何其他对象的更改通知,您希望在单例对象上实现INotifyPropertyChanged,并PropertyChange在使用该值的每个类中订阅它的事件.

例如,

public ClassA
{
    public ClassA()
    {
        MySingleton.PropertyChanged += Singleton_PropertyChanged;
    }

    void Singleton_PropertyChanged(object sender, NotifyPropertyChangedEventArgs e)
    {
        // if singleton's Number property changed, raise change 
        // notification for this class's Number property too
        if (e.PropertyName == "Number")
            OnPropertyChanged("Number");
    }

    public int Number 
    {
        get { return MySingleton.Number; }
        set { MySingleton.Number = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)