Bindingについては、必要になった時に適当に調べて書いてたけど、1つちゃんと最初から勉強してみようと思う。
ということでBindingの基本から!
Bindingは、DependencyPropertyとプロパティ(DependencyProperty含む)の値を同期するための仕組みです。
使いどころは、画面とデータを結びつける所とかです。
とりあえず、XAMLじゃなくてコードからBindingしてみようと思う。
画面が無いとはじまらないので、WpfBindingという名前でプロジェクトを作ってWindow1.xamlにTextBlockを足した。
<Window x:Class="WpfBinding.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<TextBlock Name="textBlock" />
</Grid>
</Window>
Name属性を指定してるので、C#のコードから触れるようになってる。
これにバインドするデータを作る。いつもどおりPersonクラスをこさえてみた。プロパティはNameしか持ってないシンプルなものです。
namespace WpfBinding
{
public class Person
{
public string Name { get; set; }
}
}
Window1.xaml.csのコンストラクタでバインドしてみようと思う。とりあえず書いてみるとこんな感じ。
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace WpfBinding
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
var person = new Person { Name = "田中 太郎" };
var binding = new Binding("Name") {
Source = person
};
textBlock.SetBinding(TextBlock.TextProperty, binding);
}
}
}
Bindingのコンストラクタで、プロパティ名を指定してSourceプロパティでデータのモトになるオブジェクトを設定する。
SetBindingで、どのプロパティと結びつけるかを設定するようなイメージ。
これを実行すると、下のような画面が表示される。
きちんとバインドされてるようだ。
因みに、BindingのSourceプロパティはWindowやバインド対象のコントロールの親の何処かにDataContextが設定されてれば、指定しなくても大丈夫だったりする。
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace WpfBinding
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
var person = new Person { Name = "田中 太郎" };
// WindowのDataContextに設定だ
this.DataContext = person;
var binding = new Binding("Name");
textBlock.SetBinding(TextBlock.TextProperty, binding);
}
}
}
実行結果は全く同じなので省略。
最後に、このBindingをXAMLで書くとどうなるかを見てみる。
<Window x:Class="WpfBinding.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<TextBlock Name="textBlock" Text="{Binding Path=Name}"/>
</Grid>
</Window>
とてもシンプルになった。因みに、Pathは省略して書くことも出来るので{Binding Name}と書くこともできる。
ここら辺はお好みでどうぞ。