I want two share a DepedencyProperty between to classes using AddOwner (any other approach is welcome), e.g.

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

and

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

like described here. As you might guess: Of course it doesn't work. That makes perfect sense, because it would make it impossible to create multiple instances of the same class that all have their "own" dependency property.

How do I make sure that all classes (and especially all instances) of ClassA, ClassB and any other class which refers to the property are talking about the exact same property (and therefore value)? A Singleton is no option, since Class A is a MainWindow and Class B is an UserControl (protected constructors are therefore not possible).

Regards, Ben

有帮助吗?

解决方案

I think you're misunderstanding the purpose of DependencyProperties.

They are basically a Property Definition, without a property Value.

They define things like name, type, default value, location of the value, etc however they do not contain the actual value itself. This allows the value to be provided with a binding pointing to any other property in any other location.

Your best bet is to probably just create a property that is backed by a singleton property.

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

Edit

Based on comments below where you say you want all instances of the object to respond to change notifications from any of the other objects, you'd want to implement INotifyPropertyChanged on your singleton object, and subscribe to it's PropertyChange event in each class that uses that value.

For example,

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

其他提示

One possible solution to what you want here is to use another class where you store that value. e.g.

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

Then, whereever you need that value, you can use Dependency injection to get it.

somewhere at Bootstrapper:

RootContainer.Register<IValueStore>(new SomeValueStore);

and in code:

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

This is just an idea (And I know we have a ServiceLocator here).

Perhaps you can store a reference to that ValueStore somewhere where you can get it from both classes you need it as a simple solution.

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

Please excuse me. I do not have access to my repo / visual studio right now so I cannot give better example. But I think the underlying idea is clear.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top