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

本文关键字:WPF 依赖 属性 之间 两个 共享 | 更新日期: 2023-09-27 18:02:14

我想在两个使用AddOwner的类之间共享一个DepedencyProperty(任何其他方法都是受欢迎的),例如

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));
}

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));
}
如这里所述的

。你可能猜到了:这当然行不通。这是完全有意义的,因为它不可能创建同一个类的多个实例,每个实例都有"自己的"依赖属性。

我如何确保所有类(特别是所有实例)的ClassA, ClassB和任何其他类的引用属性都在谈论完全相同的属性(因此)?Singleton不是选项,因为Class AMainWindow, Class BUserControl(因此不可能使用受保护的构造函数)。

问候,本

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

我想你误解了DependencyProperties的目的。

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

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

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

public int Number 
{
    get { return MySingleton.Number; }
    set { MySingleton.Number = value; }
}

编辑

根据下面的注释,你说你想要对象的所有实例响应任何其他对象的更改通知,你会想要在你的单例对象上实现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; }
    }
}

一个可能的解决方案是使用另一个类来存储它价值。例如

public class SomeValueStore : IValueStore
{
    int myValue {get; set;}
}

然后,无论你在哪里需要这个值,你都可以使用依赖注入来获得它。

Bootstrapper:

RootContainer.Register<IValueStore>(new SomeValueStore);

和代码中的

var valueStore = RootContainer.Resolve<IValueStore();
valueStore.myValue = 42;

这只是一个想法(我知道我们这里有一个ServiceLocator)。

也许您可以将对ValueStore的引用存储在您需要的地方作为一个简单的解决方案,你可以从你需要的两个类中获得它。

public SomeClassYouHaveAccessToFromBothSides
{
    public IValueStore _store = new SomeValueStore();
}

请原谅。我现在无法访问我的repo/visual studio我找不到更好的例子了。但我认为基本思想是清楚的。