2010-08-26 6 views
1

Scénario: Une bibliothèque VB6 appelle une méthode dans un assembly .NET via COM et ouvre une boîte de dialogue WPF, contenue dans un autre assembly .NET lié prématurément. Ce WPF-Dialog a obtenu une implémentation complexe maître/détail sur une DependencyProperty de type ObservableCollection dans cette boîte de dialogue. Le DependencyProperty ressemble à ceci:DependencyProperty conserve sa valeur après la destruction

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

Problème: Après cette boîte de dialogue se ferme par la mise en DialogResult et est complètement instancié re, ce DependecyProperty a obtenu encore ses valeurs et la boîte de dialogue affiche toujours le précédent maître/informations détaillées. Ma solution de contournement actuelle consiste simplement à laisser la boîte de dialogue effacer la collection dans son ctor, mais je n'aime certainement pas ça ... qu'est-ce qui pourrait garder cette collection vivante à travers deux instanciations?

Répondre

2

Ahh vous ne devriez pas passer new ObservableCollection en tant que valeur par défaut pour votre propriété de dépendance. Cette instance unique est configurée lors de l'exécution des initialiseurs de champs statiques (une seule fois pour l'ensemble de l'application) et cette instance de collection sera utilisée comme valeur par défaut pour chaque instance de MainWindow. Vous devez uniquement utiliser des types de valeur ou des types de référence immuables en tant que valeur par défaut pour une propriété de dépendance. Au lieu de cela, vous devez laisser la valeur par défaut pour la propriété de dépendance null, puis dans votre constructeur d'instance, la définir sur new ObservableCollection pour chaque nouvelle instance.

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

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

Merci, je vais essayer. – naacal

Questions connexes