DependencyProperty сохраняет свою ценность после уничтожения - PullRequest
1 голос
/ 27 августа 2010

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

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

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

1 Ответ

2 голосов
/ 27 августа 2010

Ах, вы не должны передавать 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>();
}
...