2010-08-26 63 views
1

場景: 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中的集合,但我當然不喜歡這個......通過兩個實例可以使這個集合保持活躍狀態​​嗎?

回答

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>(); 
} 
+0

謝謝,我會試試看。 – naacal 2010-08-26 21:09:44