2011-01-20 19 views
8

このdocumentによると、次のコードは、WPFでのメモリリークが発生しますフォームクローズイベントのすべてのバインドされた要素からバインディングを削除する方法はありますか?

​​

を我々がする必要が結合メモリリークを避けるために:

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

を私たちはXAMLでいくつかの値をバインドする場合も同じことが起こりますこのようなフォームクローズイベントにバインディング削除:

BindingOperations.ClearBinding(MyTextBlock, TextBlock.TextProperty); 

質問

フォームと子コントロールのすべてのバインドされた要素からバインディングを削除する方法はありますか?

私はここでいくつかの再帰的な方法が必要なようです。

答えて

4

与えられた例は非常に隔離されており、拘束力のある状況では典型的ではないことに注意してください。参照されるドキュメントがこれを概説...

のTextBlockコントロールは、(それがmyGrid子供の 1である)バックのTextBlockに の参照を持っている に結合するオブジェクト(myGrid)があります。

問題は、結合がUIElementオブジェクト間で行われているとオブジェクトの1がコンテナの子であり、にバインドされているpropetyがDependencyPropertyではないという事実にあります。これは、ほとんどのバインディングがINotifyPropertyChangedを実装するオブジェクト/プロパティで発生するため、これは一般的ではありません。

このような複数のバインディングがアプリケーション内にある場合は、参照されているドキュメントに記載されているように、指定されたコンテナが閉じるときに、必要に応じてそれらをクリアする方法があります。

もう1つの方法は、ビューで消費するオブジェクトに必要なデータを公開し、タイプDependencyPrpertyではないUIElementプロパティへのバインディングを無視することです。これは必ずしも実用的ではありませんが、上記の問題からあなたを緩和します。

6

WPF 4では、INotifyPropertyChangedまたはDependencyObjectでなくても、オブジェクトにバインドするときにリークが心配することはありません。このバグは修正されました。

とにかく私はBindingOperations.ClearAllBindingsが役に立ちそうです。

+0

WPF 4で修正されたこのバグへのリンクまたは参照を提供できますか? – kevindaub

+0

http://support.microsoft.com/kb/938416/en-us自分のテストを使用して修正されたことがわかりました –

+2

[ここ](http://blogs.msdn.com/b)からテストのターゲットを変更してください/jgoldb/archive/2008/02/04/finding-memory-leaks-in-wpf-based-applications.aspx)は、問題がNet4でまだ発生していることを示しています。 – vossad01

関連する問題