2014年5月16日金曜日

wpf : Bindingで更新していたプロパティに即値を入れるとBindingが解除された

基本的なことかもしれませんが、最近初めて気付きました。 例えば、あるBorderの高さのBindingを解除する場合、普通はこうします。

DependencyProperty prop = Border.HeightProperty;
if (BindingOperations.IsDataBound(border, prop))
    BindingOperations.ClearBinding(border, prop);

その代わりにこうしてもいいようです。

border.Height = border.ActualHeight;

まぁ「解除できる」というか、解除されてしまったせいでバグになってつまづいたんですけどね。 すぐに理由が分かってよかった。

ClearBindingしたときはプロパティの値がデフォルト値になってしまいます。 Bindingを解除した後もプロパティの値を継続する場合はちょっとだけコードが必要かと思ってました。

DependencyProperty prop = Border.HeightProperty;
if (BindingOperations.IsDataBound(border, prop))
{
    var h = border.ActualHeight;
    BindingOperations.ClearBinding(border, prop);
    border.Height = h;
}

それが不要でちょっとだけ得した気分。


一応、確認用の簡単なコードを載せておきます。 まずはMainWindow.xaml。

MainWindow.xaml.csです。

tの値をデバッガで見て、「ああ、Binding解除されてるねぇ。」と呟いてみたり...

アレ? DependencyPropertyの変数宣言にvar使ってない? まぁいいや。