TextBoxに入力された値が負の数だった場合、フォントを赤くする。

SilverlightのBindingは、与えられた値を加工して表示フォーマットを変更したり型を変更したりできるValueConverterという仕組みがあります。また、バインディングソースにコントロールのプロパティを指定できます。
これらの機能を利用してTextBoxに入力した値が負の数だった場合は、そのTextBoxのForegroundを赤にする方法を紹介します。

アジェンダ

  • ValueConverterの定義する
  • ValueConverterを使用する
  • まとめ

ValueConverterの定義する

IValueConverterを継承したクラスを定義します。IValueConverterは二つのメソッドを持っています。

メソッド名 機能
Convert ソースの値をターゲットにセットする前に呼ばれる。数値をカンマ区切り表記に変更する、などの機能を実装する。
ConvertBack ターゲットの値をソースにセットする前に呼ばれる。バインディングモードがTwoWayの時のみこのメソッドは呼ばれる。

今回は、BindingのModeをOneWayにしますので、IValuConveterのConvertBackメソッドの中身は空のままとします。

public class BrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        double number;
        if (double.TryParse(value as string, out number))
        {
            if (number >= 0)
            {
                // 負の数だった場合、黒を返す
                return new SolidColorBrush(Colors.Black);
            }
            else
            {
                // 負の数だった場合、赤を返す
                return new SolidColorBrush(Colors.Red);
            }
        }
        else
        {
            return new SolidColorBrush(Colors.Black);
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
    // BindingModeがOneWayを想定しているので未実装で問題ない。
        throw new NotImplementedException();
    }
}

ValueConverterを使用する

XAMLに以下の内容を記述します。

xmlnsの定義
xmlns:my="clr-namespace:ValueConverterSample"
BrushConverterのインスタンスを定義
<UserControl.Resources>
    <my:BrushConverter x:Key="BrushConverter"/>
</UserControl.Resources>
TextBoxでValueConverterを使用する

バインディングのソースをTextBox自身のTextプロパティとします。バイディング機能でコントロール自身をソースにできるようになったのは、いろいろと便利です(乱用するとどこで何をバインドしたかわからなくなりがちですが)。

<TextBox x:Name="TbxSouce" 
         Foreground="{Binding Text, Converter={StaticResource BrushConverter}, ElementName=TbxSouce}"
         Width="150" 
         />

まとめ

バインディング機能を利用してTextBoxに入力した値が負の数だった場合は、そのTextBoxのForegroundを赤にする方法を紹介しました。