WPF ViewModelをBindignして表示変更通知をして画面書き換えテキストボックスへの入力をViewModelへ反映

イラスト XAML

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;
        }

コメント

タイトルとURLをコピーしました