DependencyProperty在破坏后保留它的值

问题描述:

场景: VB6库通过COM调用.NET程序集中的方法,并打开一个WPF对话框,该对话框包含在另一个早期绑定的.NET程序集中。这个WPF对话框在这个对话框上通过ObservableCollection类型的DependencyProperty获得了复杂的主/细节实现。该的DependencyProperty看起来是这样的:DependencyProperty在破坏后保留它的值

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

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

啊,你不应该通过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>(); 
} 
+0

谢谢,我会试试看。 – naacal 2010-08-26 21:09:44