DependencyProperty在销毁后保留它的值

时间:2010-08-26 20:58:22

标签: c# .net wpf vb.net dependency-properties

场景: VB6库通过COM调用.NET-Assembly中的方法,并打开一个WPF-Dialog,它包含在另一个早期绑定的.NET-Assembly中。此WPF-Dialog在此对话框上的ObservableCollection类型的DependencyProperty上获得了一个复杂的主/详细实现。 DependencyProperty看起来像这样:

public static readonly DependencyProperty ThatDependencyPropertyProperty =
        DependencyProperty.Register("ThatDependencyProperty", typeof(ObservableCollection<SomeClass>)
            , typeof(MainWindow), new UIPropertyMetadata(new ObservableCollection<SomeClass>()));

问题:通过设置DialogResult关闭此对话框并完全重新实例化后,此DependecyProperty仍然获得了它的值,对话框仍然显示以前的主/详细信息。我目前的解决方法是简单地让对话框清除它的ctor中的集合,但我当然不喜欢这个...什么可以通过两个实例保持这个集合的活着?

1 个答案:

答案 0 :(得分:2)

啊,您不应该将new ObservableCollection作为依赖项属性的默认值传递。当静态字段初始化程序运行时(整个应用程序一次)设置此单个实例,并且该集合实例将用作MainWindow的每个实例的默认值。您应该只使用值类型或不可变引用类型作为依赖项属性的默认值。

相反,您应该将依赖项属性的默认值保留为null,然后在实例构造函数中,为每个新实例将其设置为new ObservableCollection

public static readonly DependencyProperty ThatDependencyPropertyProperty =
    DependencyProperty.Register("ThatDependencyProperty", typeof(ObservableCollection<SomeClass>)
        , typeof(MainWindow), new UIPropertyMetadata(null));

public MainWindow() {
    this.ThatDependencyProperty = new ObservableCollection<SomeClass>();
}