ViewModelを作ってみる
とりあえず、Bindingさせるだけ
ViewModel
class MainVewModel
{
public string TimeSttTxt { get; set; } = "開始時刻";
public string TimeEndTxt { get; set; } = "終了時刻";
}
XAML
<StackPanel HorizontalAlignment="Center">
<TextBlock x:Name="Start" Text="{Binding Path=TimeSttTxt}" />
<TextBlock x:Name="End" Text="{Binding Path=TimeEndTxt}" />
</StackPanel>
コードビハインド
public MainWindow()
{
InitializeComponent();
this.DataContext = new vm.MainVewModel();
}
これで、テキストブロックに開始時刻・終了時刻が表示される
ViewModelのプロパティ値に変化があった時に通知する
上記のコードでは、変更通知がないので、ViewModelの値を変更してもXAMLに反映されません。値に変化があったときにViewの値も更新するようにします。
XAMLの書き方は PATH=を省略する事も可能です。
<TextBlock x:Name="Start" Text="{Binding TimeSttTxt}" />
<TextBlock x:Name="End" Text="{Binding TimeEndTxt}" />
ViewModel に、INotifyPropertyChanged(System.ComponentModel名前空間)インターフェイスを継承して「プロパティ値が変更されたことをクライアントに通知する」イベントを実装します。
class MainViewModel : INotifyPropertyChanged
{
//public string TimeSttTxt { get; set; } = "開始時刻";
public string TimeEndTxt { get; set; } = "終了時刻";
private string timestttxt;
public string TimeSttTxt
{
get { return timestttxt; }
set
{
timestttxt = value;
// 通知するプロパティを引数に指定する。
// これを書かないと通知されない。
NotifyPropertyChanged("TimeSttTxt");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
コードビハインド
private MainViewModel viewmodel;
public MainWindow()
{
InitializeComponent();
viewmodel = new MainViewModel()
{
TimeSttTxt = "開始時刻",
TimeEndTxt = "終了時刻"
};
this.DataContext = viewmodel;
}
private void B_Test_Click(object sender, RoutedEventArgs e)
{
viewmodel.TimeSttTxt = DateTime.Now.ToLongTimeString();
}
テストボタンを押すと、現在時刻がTimeSttTxtに反映されViewにもみられるようになります。
テキストボックスの値をViewModelへ反映させる
XAML
<StackPanel>
<TextBox x:Name="T_01" Text="{Binding T_01}" />
<Button x:Name="B_GetID" Content="GetID" Click="B_GetID_Click" />
</StackPanel>
ViewModel
XAML側で値が入力されて変わった場合も、ViewModelに反映されるようにする
class MainViewModel : INotifyPropertyChanged
{
private string t_01;
/// <summary>
/// TextBoxに表示する文字列のプロパティ
/// </summary>
public string T_01
{
get
{
// 内部変数の値を戻す
return t_01;
}
set
{
// 入力値:valueを内部変数にセット
t_01 = value;
// 通知するプロパティを引数に指定する。
// これを書かないと通知されない。
NotifyPropertyChanged("T_01");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
コードビハインド
テキストボックス T_01に入力した内容を、メッセージボックスに表示してみる。
public MainWindow()
{
InitializeComponent();
viewmodel = new MainViewModel()
this.DataContext = viewmodel;
}
private void B_GetID_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(viewmodel.T_01);
}
前項のコードにつなぎ合わせていれば、テキストブロックへの反映もViewModelのプロパティ値に設定すればXAML側への反映される
private void B_GetID_Click(object sender, RoutedEventArgs e)
{
viewmodel.TimeEndTxt = viewmodel.T_01;
}
コメント