我必须以某种方式弄错语法。出于某种原因,我的依赖对象表现得像是静态的。我有以下几点:
public void main()
{
MyClass C1 = new MyClass();
MyClass C2 = new MyClass();
C1.StringCollection.Add("Test1");
Console.WriteLine(C2.StringCollection.First());
}
public class MyClass : DependencyObject
{
public static DependencyProperty StringCollectionProperty = DependencyProperty.Register(
"StringCollection",
typeof(ObservableCollection<string>),
typeof(MyClass),
new PropertyMetadata(new ObservableCollection<string>()));
public ObservableCollection<string> StringCollection
{
get { return(ObservableCollection<string>)GetValue(StringCollectionProperty); }
set { SetValue(StringCollectionProperty, value); }
}
}
给出以下输出:
Test1
添加到C2的元素将在C1的StringCollection中可用,反之亦然。知道我做错了吗?
答案 0 :(得分:1)
Aquarium
和Fishes
示例中的MSDN页面中提到了完全相同的行为。
引用同一页面的摘录略有修改:
这是因为每个MyClass都将String添加到默认值集合中,这是由元数据中的单个构造函数调用产生的,因此在所有实例之间共享。这种情况几乎不是你想要的。
要解决此问题,必须将集合依赖项属性值重置为唯一实例,作为类构造函数调用的一部分。因为该属性是只读依赖项属性,所以使用SetValue(DependencyPropertyKey,Object)方法来设置它,使用只能在类中访问的DependencyPropertyKey。
public MyClass() : base()
{
SetValue(StringCollectionProperty, new ObservableCollection<string>());
}
现在,如果再次运行相同的测试代码,您可以看到更多预期结果,其中每个MyClass都支持其自己的唯一集合。 如果您选择将集合属性设置为可读写,则此模式会有轻微变化。在这种情况下,您可以从构造函数调用公共集访问器来进行初始化,这仍然会使用公共DependencyProperty标识符在您的集合包装器中调用SetValue(DependencyProperty,Object)的非键签名。