参考:
http://www.programmingtidbits.com/post/2013/03/13/Blend-Behaviors-And-DependencyPropertyDescriptor-Equals-Memory-Leak.aspx
http://agsmith.wordpress.com/2008/04/07/propertydescriptor-addvaluechanged-alternative/
以下のように Behavior.OnAttached の中で DependencyPropertyDescriptor.AddValueChanged
を実行するとメモリリークします。
public class HogeBehavior : Behavior<FrameworkElement>
{
protected override void OnAttached()
{
base.OnAttached();
DependencyPropertyDescriptor
.FromProperty(FrameworkElement.ActualHeightProperty, typeof(FrameworkElement))
.AddValueChanged(AssociatedObject, ActualHeightChanged);
}
protected override void OnDetaching()
{
base.OnDetaching();
DependencyPropertyDescriptor
.FromProperty(FrameworkElement.ActualHeightProperty, typeof(FrameworkElement))
.RemoveValueChanged(AssociatedObject, ActualHeightChanged);
}
private void ActualHeightChanged(object sender, EventArgs e)
{
}
}
OnDetaching で解除できるように見えますが、AddValueChanged で AssociatedObject が参照され続けてしまうため、永久に解除されません。
参照を解除しないと OnDetaching が実行できない → OnDetaching を実行しないと参照を解除できない、というデッドロックに陥っているためです。
参考にしたページでは、解決方として DepenencyObject と Biniding を使った方法を紹介しています。
Binding であれば WeakReference なので問題なさそうですね。