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

时间:2014-05-07 14:24:52

标签: 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));
}

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

如描述here。正如你可能猜到的那样:当然它不起作用。这是完全合理的,因为它将无法创建具有“自己的”依赖属性的同一个类的多个实例。

如何确保ClassAClassB所有类(尤其是所有实例)以及任何其他引用的类该物业正在谈论完全相同的财产(因此价值)? Class A不可选,因为MainWindowClass BUserControl是{{1}}(因此无法保护构造函数)。

此致 本

2 个答案:

答案 0 :(得分:4)

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

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

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

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

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

修改

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

例如,

PropertyChange

答案 1 :(得分:0)

您想要的一个可能的解决方案是使用另一个存储它的类 值。 e.g。

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 所以我不能给出更好的例子。但我认为潜在的想法是明确的。