状態変化に応じてデータバインディングを抜き差しする

Sliderを使って値を決めるUIで、TextBoxとCheckBoxで値の取りうる範囲を切り替えたい。たとえば、下表の関係にしたい。

CheckBox.Checked Slider.Maximum Slider.Minimum
false 0 TextBox.Text
true -TextBox.Text TextBox.Text

Slider.Maximumは単純にString→DoubleのConverterで実装できるとして、Slider.Minimumはどうしたらいいか?
ConverterにCheckBoxの状態を監視させて…としたいところだけど、なんかハマりそうな予感がする。
というわけで、CheckBoxのイベントを拾って動的にバインディングを変更することにした。

private void HandleCheck(object sender, RoutedEventArgs e)
{
    // 動的にバインディング
    Binding bi;
    bi = new Binding("Max"); //TextBoxの中身をViewModel.Maxに入れている
    bi.Converter = new StringToNegativeDoubleConverter(); //符号反転
    slider.SetBinding(Slider.MinimumProperty, bi);
}

private void HandleUnchecked(object sender, RoutedEventArgs e)
{
    //定数を入れるとバインディングは外れる
    slider.Minimum = 0;
}


こちらを参考にしました。XAMLバインディングしない方が良くない?という話。

・そもそも View と Model を分離して View はデザイナ、Model はプログラマ、と切り分けができるのではなかったか?
・View 自体は Microsoft Exprssion Blend を使って編集するわけだから、いちいち Binding の分が書いてあるのはどうかと思う。
・間違って消しちゃったら、Binding は直すの大変。ここのコードを書くのはプログラマなんだから、Viewに手を加えるの問題あり。

XAMLの動的バインド | Moonmile Solutions Blog


今回の件は、たぶんこっちで実装するのがスマートなんだろうなぁ。そのうち試そう。
thinkami.hatenablog.com