在两个类之间共享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 A
是MainWindow
, Class B
是UserControl
(因此不可能使用受保护的构造函数)。
问候,本
我想你误解了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我找不到更好的例子了。但我认为基本思想是清楚的。