2010-08-26 3 views
1

Сценарий: Библиотека VB6 вызывает метод в .NET-Assembly через COM и с этим открывает WPF-диалог, который содержится в другой .NET-Assembly, которая ранняя. Этот WPF-Dialog получил сложную реализацию master/detail над DependencyProperty типа ObservableCollection в этом диалоговом окне. DependencyProperty выглядит примерно так:DependencyProperty сохраняет свою ценность после уничтожения

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

Проблема: После этого диалогового окна закрывается путем установления DialogResult и быть полностью переработан экземпляром, это DependecyProperty еще получил это значение и диалог по-прежнему отображает предыдущий мастер/детальная информация. Моим текущим обходным решением является просто позволить диалоку очистить коллекцию в нем, но мне это, конечно, не нравится ... что может сохранить эту коллекцию в живых через два экземпляра?

ответ

2

Ahh вы не должны передавать 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

Смежные вопросы