如何防止DependencyObjects跨所有实例共享他们的DependencyProperties?

时间:2014-09-29 09:51:41

标签: c# wpf

我必须以某种方式弄错语法。出于某种原因,我的依赖对象表现得像是静态的。我有以下几点:

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中可用,反之亦然。知道我做错了吗?

1 个答案:

答案 0 :(得分:1)

AquariumFishes示例中的MSDN页面中提到了完全相同的行为。

引用同一页面的摘录略有修改:

  

这是因为每个MyClass都将String添加到默认值集合中,这是由元数据中的单个构造函数调用产生的,因此在所有实例之间共享。这种情况几乎不是你想要的。

     

要解决此问题,必须将集合依赖项属性值重置为唯一实例,作为类构造函数调用的一部分。因为该属性是只读依赖项属性,所以使用SetValue(DependencyPropertyKey,Object)方法来设置它,使用只能在类中访问的DependencyPropertyKey。

public MyClass() : base()
{
    SetValue(StringCollectionProperty, new ObservableCollection<string>()); 
}
  

现在,如果再次运行相同的测试代码,您可以看到更多预期结果,其中每个MyClass都支持其自己的唯一集合。   如果您选择将集合属性设置为可读写,则此模式会有轻微变化。在这种情况下,您可以从构造函数调用公共集访问器来进行初始化,这仍然会使用公共DependencyProperty标识符在您的集合包装器中调用SetValue(DependencyProperty,Object)的非键签名。