WPFのTextBoxでデータバインディングを行うサンプルプログラム

コンピュータ

TextBoxの入力した内容をデータバインディングを使い、TextBlcokに表示するサンプルプログラムです。


MainWindowViewModel.cs

// メインウィンドウのViewModel
using Maywork.WPF.Helpers;

namespace TextBoxBindingDemo;

public class MainWindowViewModel : ViewModelBase
{
    // バインド可能なUserNameプロパティ
    string _userName = "";  // 初期値は""
    public string UserName
    {
        get => _userName;
        set => SetProperty(ref _userName, value);
    }
}

XAMLのコントロールのプロパティとバインド元となるクラスです。
ViewModelBase.csを継承し、ViewModelを作成します。
バインド可能なプロパティUserNameを定義しています。
値の変更をトリガーとして、変更通知の処理を行いますが、定型な処理ですので、ViewModelBaseのSetProperty()へ処理を集約しています。


MainWindow.xaml.cs

using System.Windows;

namespace TextBoxBindingDemo;

public partial class MainWindow : Window
{
    MainWindowViewModel _vm;
    public MainWindow()
    {
        InitializeComponent();

        // ビューモデルを生成
        _vm = new MainWindowViewModel();
        // データコンテキストに生成したビューモデルのインスタンスをセット
        DataContext = _vm;
    }
}

メインウィンドウのコードビハインド部分です。
コンストラクタで、ViewModelを生成しメインウィンドウのDataContextとして登録しています。
ViewとViewModelを紐づけしている部分になります。


<Window x:Class="TextBoxBindingDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TextBoxBindingDemo"
        mc:Ignorable="d"
        Title="Binding Sample" Height="200" Width="300">
    <Grid>
        <StackPanel Margin="20">

            <!-- 入力用 -->
            <TextBox Text="{Binding UserName, UpdateSourceTrigger=PropertyChanged}"
                    Margin="0,0,0,10"/>

            <!-- 表示用 -->
            <TextBlock FontSize="16"
                    Text="{Binding UserName}" />

        </StackPanel>
    </Grid>
</Window>

XAMLで定義された View部分 になります。

TextBoxとTextBlockが定義されており、
それぞれの Text プロパティに UserName がバインディングされています。

<TextBox Text="{Binding UserName, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="{Binding UserName}" />

TextBox の UpdateSourceTrigger=PropertyChanged を指定しているため、
1文字入力されるごとに、即座に ViewModel 側の UserName が更新されます
もしこれを指定しない場合、
デフォルトでは フォーカスが外れたタイミングで更新 されます。

実際の処理の流れは以下のようになります。

TextBox
   ↓
Binding Engine
   ↓
VM.UserName set
   ↓
OnPropertyChanged
   ↓
Binding Engine
   ↓
TextBlock

WPFは

「値が変わったことを通知されたときだけUIを更新する」

という仕組みです。

そのため、

INotifyPropertyChanged

の実装が必要になります。

今回利用している
ViewModelBase.cs は、

INotifyPropertyChanged を実装したヘルパークラスです。

ViewModelはこのクラスを継承して作成しています。


実行すると、テキストボックスが表示されます。

テキストボックスに文字を入力すると、その入力内容が下の TextBlock にも表示されます。

これは、TextBox.TextとTextBlock.Textの両方が、
同じ ViewModel の UserName プロパティにバインディングされているためです。

コメント