2013年01月18日

[C# WPF]Bindingソースの更新を表示に反映する -NotifyPropertyChanged-

前回までは画面で編集したデータがBindingソースに設定される事を確認しました。
今回はBindingソースが更新されたら表示も更新されるようにします。

この為にINotifyPropertyChangedインターフェースを使用します。

サンプルを見ていきます。

xamlコードです。



<Grid>
<Label Height="23" Width="70" Margin="5"
HorizontalAlignment="Left" VerticalAlignment="Top"
Content="{Binding Data.Message}" />
<TextBox Height="23" Width="70" Margin="5,35,0,0"
HorizontalAlignment="Left" VerticalAlignment="Top"
Text="{Binding Data.Message}" />
<Button Height="23" Width="70" Margin="5,70,0,0"
HorizontalAlignment="Left" VerticalAlignment="Top"
Content="Button"/>
</Grid>




LabelとTextBoxとButtonを配置しています。
LabelのContentとTextBoxのTextにMessageプロパティをBindしています。
ButtonはTextBox以外のコントロールにフォーカスを移動する為だけに配置しています。

次にcsコードです。



public partial class MainWindow : Window, INotifyPropertyChanged
{
private string message;
public string Message
{
get { return message; }
set
{
message = value;
OnPropertyChanged("Message");
}
}

public MainWindow()
{
InitializeComponent();

this.DataContext = this;
}

public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}

}




赤字の部分を見てください。
更新を表示に反映させたいBindingソースを持つクラスに
INotifyPropertyChangedインターフェースを実装します。
INotifyPropertyChangedはSystem.ComponentModel名前空間に属しているので
usingの指定もしてください。
INotifyPropertyChnagedインターフェースは
PropertyChangedEventHandlerイベントオブジェクトを持ちます。
表示に更新を反映したいプロパティの更新のタイミングで
PropertyChangedイベントを発行します。
イベント引数には変更されたプロパティ名を指定します。

では実行してみましょう。
1.jpg

TextBoxを編集してフォーカスをボタンに移動すると
LabelにTextBoxに入力した値が設定されます。

TextBoxを編集して値がBindingソースであるMessageプロパティに設定されると
PropertyChangedイベントを発行します。
このイベントが発行されるとMessageプロパティを
Bindingしているすべてのコントロールが更新されます。

TextBoxの編集した値がBindingソースに設定されるタイミングは
デフォルトではフォーカスが移動したタイミングです。
TextBoxからフォーカスを移動するためにButtonを配置しています。


posted by cw at 15:00| Comment(2) | Binding | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
これ、前回の続きですか?
違っていれば、.xamlのファイルのBinding宣言に余計な「Data.」がはいっていると思うんですが・・・。
Posted by AsaBon at 2013年08月07日 18:39
ここのコメントの訂正がなければ、ずっと動かないことに悩みつづけるところだった。

たしかに、BindingしているData.Message→Messageにする必要がありますね。
Posted by at 2014年07月06日 23:46
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。