Silverlight2にも、WPFと同じようにBindingがある。
ただ、これもWPFのとはちょいと違う。
たとえば、デフォルトのModeがTwoWayではない。
WPFの時だと<TextBox Text="{Binding Path=XXXX}" />って書いておけば、とりあえずTextBoxでの入力は、フォーカスが外れたタイミングでバインド先のソースへ反映されていた。
Silverlightだと反映されない。Modeのデフォルト値がOneWayになっている。
ということで、SilverlightのBindingで、双方向で値の変更を有効にしたい場合はModeにTwoWayを明示的に書く必要がある。
お試し
この動きを確認するために小さなサンプルを作成してみる。まずは、Silverlightアプリケーションを作成して、以下のようなシンプルなプロパティを1つもっただけのクラスを作成する。
// サンプルアプリのモデルクラス
public class Model : INotifyPropertyChanged
{
#region お約束のINotifyPropertyChangedの実装
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
#endregion
#region バインド用のプロパティ
private string _value = "初期値";
public string Value
{
get { return _value; }
set
{
_value = value;
OnPropertyChanged("Value");
}
}
#endregion
}
Page.xaml.csのコンストラクタで、DataContextに上記のModelクラスのインスタンスを代入する。
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
// DataContextにModelを指定
DataContext = new Model();
}
// 簡単にDataContext内のModelにアクセスできるようにするための
// プロパティ
public Model Model
{
get { return DataContext as Model; }
}
}
これで準備は完了!XAML側にバインドのターゲットになるTextBoxと、値を確認するためのアクションを起こすボタンを配置する。
<UserControl x:Class="SilverlightValidation.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<StackPanel x:Name="LayoutRoot" Background="White">
<TextBox x:Name="textBox" Text="{Binding Path=Value}" />
<Button Content="OK" Click="Button_Click" />
</StackPanel>
</UserControl>
ボタンのクリックイベントでは、ModelのValueをメッセージボックスに表示するようにした。
とりあえず値が確認できればなんでもいい。
private void Button_Click(object sender, RoutedEventArgs e)
{
// ボタンクリック時にModelのValueを確認
MessageBox.Show(Model.Value);
}
この状態では、BindingのModeを何も指定してないので、TextBoxの値を変更してもModelのValueは書き換わらない予定になってる。早速実行して確認をする。
初期状態でボタンを押す。
テキストボックスの値を変えてからボタンを押す。
ModelのValueは変わってないのが確認できた。
次にModeをTwoWayにして実行すると
<TextBox x:Name="textBox" Text="{Binding Path=Value, Mode=TwoWay}" />
実行してみよう。
とりあえず初期状態でボタンを押してみる。
そしてTextBoxを変更してボタンを押してみる。
ばっちり値が変わってる。
WPFとSilverlightは、細かいところで動きが違ったりするので、しっかり違いを把握してから使わないと大変そうだ。
今度綺麗に違いがまとまってるところが無いか探してみよう。