Last-modified: Mon, 15 Apr 2013 03:58:05 JST
Counter:2508 Today:1 Yesterday:2 Online:12
このエントリーをはてなブックマークに追加

1 - 最もシンプルなバインディング

About

この項目では最もシンプルなバインディングのパターンを示します。後に続く項目はこの項目の内容を引き継ぐので参照順には注意してください。

バインディングの用意

バインディングするデータはシンプルなものを用意しました。この項目ではstring型とbool型のプロパティ、2つを持ったクラス"SimpleClass"を利用します。

        public class SimpleClass
        {
            public string StringProperty { get; set; }
            public bool BoolProperty { get; set; }
        }

値をバインディングする対象はXAMLの方に用意しました。string型の値をバインディングするTextBoxと、bool型の値をバインディングするCheckBoxの2つです。また出力してバインディングの結果を確認するためのButtonも用意してあります。

こちらの2つに関してはコード側からnewキーワードによってインスタンスを生成しても問題はありません。ソースコードの冗長性と、サンプルを少しでも実用的な例に近づけるための措置です。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Name="stackPanel">
        <Button Content="Console Write" Height="30" Click="Button_Click" />
        <TextBox Name="textBox"/>
        <CheckBox Name="checkBox"/>
    </StackPanel>
</Window>

ソースコードからのバインディング

バインディングはコンストラクタ内で行ってしまいます。まずバインディングするデータSimpleClassのインスタンスを生成し、それぞれのプロパティに適当な値を与えておきます。

次に本題であるバインディングを行います。バインディングにはBindingクラスを利用します。コンストラクタによってインスタンスを生成するときに、引数としてバインディングするプロパティ名を与えます。ここでは"SimpleClass"クラスのプロパティ"StringProperty"と"BoolProperty"となります。

バインディングには、バインディングする値を提供する情報源が必要です。記述方法は自由ですが、ここではインスタンスの生成と同じタイミングで行っています。BindingクラスのプロパティSourceにバインディングしたいデータを設定します。ここでは"SimpleClass"のインスタンスです。

        SimpleClass SimpleClassData;
…
        public MainWindow()
        {
            InitializeComponent();

            //Bindingするデータを作る
            this.SimpleClassData = new SimpleClass();
            this.SimpleClassData.BoolProperty = true;
            this.SimpleClassData.StringProperty = "Hello.";

            //TextBox ver.
            Binding textboxBinding
                = new Binding("StringProperty")
                { Source = this.SimpleClassData };
            textBox.SetBinding(TextBox.TextProperty, textboxBinding);

            //CheckBox ver.
            Binding checkboxBinding
                = new Binding("BoolProperty")
                { Source = this.SimpleClassData };
            checkBox.SetBinding(CheckBox.IsCheckedProperty, checkboxBinding);
        }

バインディングする対象に、設定を終了したBindingインスタンスを設定すれば手続きは完了です。対象のインスタンスのSetBindingメソッドからBindingデータを設定します。引数には、対象となるプロパティと、設定を終えたBindingクラスのインスタンスを与えます。言葉で説明すると少々不明瞭ですが、ソースコードを見れば状況は把握できるかと思います。

ここではそれぞれ、TextBoxのTextプロパティと、CheckBoxのIsCheckedプロパティにバインディングを適用します。こうすることでSimpleClassのプロパティの値が、TextBoxとCheckBoxのそれぞれのプロパティにバインディングされます。

実行と確認

バインディングされているかどうかは実行すればすぐにわかります。TextBoxやCheckBoxに値を設定していないのにもかかわらず、SimpleClassのプロパティに設定した値が適切に与えられていればバインディングは成功です。

ここでバインディングしたデータをTextBoxとCheckBox側から操作できているか確認するために、バインディングしたデータをコンソールに出力します。Buttonを押したタイミングで出力するとして、そのイベントハンドラのソースコードは次のようになっています。

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Console.WriteLine(this.SimpleClassData.StringProperty);
            Console.WriteLine(this.SimpleClassData.BoolProperty);
        }

サンプルではStringPropertyに文字列"Hello"を与えていましたが、TextBoxに表示された"Hello"を適当な文字列に書き換えて、Buttonを押して値を出力します。出力されたStringPropertyの値が、インターフェース上から書き換えられた文字列になっていることが確認できます。

これでこの項目の解説は終了です。試しにint型のプロパティやそれに対応するインターフェースを追加して確認してみるなど、すると良いと思います。