Есть ли способ удалить привязки из всех связанных элементов в событии закрытия формы? - PullRequest
8 голосов
/ 20 января 2011

Согласно этому документу следующий код вызывает утечку памяти в WPF:

myDataBinding = new Binding("Children.Count");
myDataBinding.Source = myGrid; 
myDataBinding.Mode = BindingMode.OneWay;
MyTextBlock.SetBinding(TextBlock.TextProperty, myDataBinding);

То же самое происходит, если мы связываем некоторое значение в XAML:

<TextBlock Name="MyTextBlock" Text="{Binding ElementName=myGrid, Path=Children.Count}" />

Чтобы избежать утечек памяти привязки, нам нужно удалить привязку на событии закрытия формы следующим образом:

BindingOperations.ClearBinding(MyTextBlock, TextBlock.TextProperty);

Вопрос

Есть ли способ удалить привязки со всех связанных элементов на форме и дочерних элементах управления?

Кажется, здесь мне понадобится рекурсивный метод.

Ответы [ 2 ]

6 голосов
/ 20 января 2011

В WPF 4 вы можете не беспокоиться об утечках при привязке к объекту, даже если это не INotifyPropertyChanged или DependencyObject.Эта ошибка была исправлена.

В любом случае, я полагаю, BindingOperations.ClearAllBindings будет полезно.

4 голосов
/ 20 января 2011

Имейте в виду, что приведенный пример был очень изолированным и не типичным для обязательной ситуации.Ссылочный документ обрисовывает в общих чертах это ...

Элемент управления TextBlock имеет привязку к объекту (myGrid), который имеет ссылку обратно на TextBlock (это один из дочерних элементов myGrid).

Проблема заключается в том, что привязка происходит между UIElement объектами И один из объектов является дочерним элементом контейнера И привязываемое свойство не является DependencyProperty.Опять же, это не типично, так как большая часть привязки происходит с объектом / свойством, которое реализует INotifyPropertyChanged.

Если в вашем приложении есть несколько таких привязок, то подход должен заключаться в их очистке, когда это необходимоКонтейнер закрывается, как упомянуто в ссылочном документе.

Другой подход состоит в том, чтобы просто предоставить необходимые вам данные об используемом вами объекте при просмотре и игнорировать привязку к свойствам UIElement, которые не относятся к типу DependencyPrperty,Хотя это не всегда практично, это избавит вас от вышеупомянутой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...