场景: 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中的集合,但我当然不喜欢这个...什么可以通过两个实例保持这个集合的活着?
答案 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>();
}