さらにチェックを切り替えよう。

入力すると背景色が変わるTextBoxの続き
背景色の変更とともに、更にチェックボックスを切り替えてみる。

仕様:
TextBoxに入力有り→チェックON
TextBoxに入力無し→チェックOFF

CheckBoxのIsCheckedはbool型で、TextBoxのTextプロパティはstring型。型が違う。
string型をbool型に変えたい時に使うのがコンバータだ。
クラスにSystem.Windows.Data.IValueConverterインターフェースを実装する事で、コンバータとして使うことができる。上記仕様の動作となるように、コンバータクラスを作る。

using System;
using System.Windows;
using System.Windows.Data;

namespace TawamureDays {

/// <summary>
/// 文字列の内容(空文字かどうか)をBoolに変換するコンバータ
/// </summary>
[ValueConversion(typeof(string), typeof(bool))]
public sealed class StringToBoolConverter : IValueConverter {

#region IValueConverter メンバー

/// <summary>
/// 値を変換します。
/// </summary>
/// <param name="value">バインディング ソースによって生成された値。</param>
/// <param name="targetType">バインディング ターゲット プロパティの型。</param>
/// <param name="parameter">使用するコンバーター パラメーター</param>
/// <param name="culture">コンバーターで使用するカルチャ。</param>
/// <returns>変換された値</returns>
public object Convert(object value,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture) {

if (value == null) {
return false;
}

return !string.IsNullOrWhiteSpace(value.ToString());
}

/// <summary>
/// 値を変換します。
/// </summary>
/// <param name="value">バインディング ターゲットによって生成される値。</param>
/// <param name="targetType">変換後の型。</param>
/// <param name="parameter">使用するコンバーター パラメーター</param>
/// <param name="culture">コンバーターで使用するカルチャ。</param>
/// <returns>変換された値</returns>
public object ConvertBack(object value,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture) {
//モード「TwoWay」なら。実装する必要はあるけど…
return Binding.DoNothing;
}

#endregion
}
}

作成したコンバータクラスをDataBindingに利用する。

<Window x:Class="TawamureDays.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:nfc="http://nichia.jp/sys/foundation/component/gui"
xmlns:local="clr-namespace:TawamureDays"
Title="MainWindow" Height="213" Width="385">
<StackPanel VerticalAlignment="Top" HorizontalAlignment="Left">
<StackPanel.Resources>
<Style TargetType="TextBox">
<Setter Property="TextBox.Background" Value="AntiqueWhite"/>
<Style.Triggers>
<Trigger Property="TextBox.Text" Value="">
<Setter Property="TextBox.Background" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
<local:StringToBoolConverter x:Key="StringToBoolConverter"/>
</StackPanel.Resources>
<TextBox MinWidth="100" />
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding Text,
ElementName=Text1,
Converter={StaticResource StringToBoolConverter}}"
Content="チェックだよ"/>
<TextBox MinWidth="100" Name="Text1"/>
</StackPanel>
</StackPanel>
</Window>

CheckBoxのIsCheckedプロパティにデータバインディングを仕掛けている。

{Binding Text, ElementName=Text1, Converter={StaticResource StringToBoolConverter}}

・"Text"はPathプロパティに渡すソース側のプロパティ。Path=Textと同じ意味になる。
・ElementNameは、XAML上のコントロールを参照できる。CheckBoxの下にあるTextBoxを指定している。
・Converterには、リソースで定義したStringToBoolConverterインスタンスを指定している。
StaticResourceに渡しているのはリソースキー。

Resourceの参照方法には、StaticとDynamicがある。役割は名前の通り。起動後に変更される可能性があるリソースには、DynamicResourceが使われる。
Skinなどでよく利用されるけど、気をつけて使わないと、メモリリークの元になる。なので、できるだけStaticResourceにする。
20120614_2
まあ、作ってはみたんだけど、こうやっちゃうと、CheckBoxのチェック状態が、DataContext側で把握できなくなるんだよな。チェックボックスそのものを押す事でも切り替えられるので、isCheckedの状態を把握しようと思うなら、この実装はペケなんだよな。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m