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)
就像这里描述的那样。正如您可能猜到的那样:当然它不起作用。这是完全有道理的,因为不可能创建同一个类的多个实例,而这些实例都具有“自己的”依赖属性。
我如何确保所有类(特别是所有实例)的ClassA
,ClassB
它指的是财产和其他类都在谈论完全相同的性质(因此价值)?甲辛格尔顿是没有选择,因为Class A
是MainWindow
和Class B
是一个UserControl
(因此保护构造是不可能的)。
问候,本
我认为您误解了 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)