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>();
}
谢谢,我会试试看。 – naacal 2010-08-26 21:09:44