Blazor01

BlazorでのWebアプリケーション開発手法1【C#】D02_双方向データバインド

今回は「双方向データバインド」について解説します。これまで扱ってきたデータバインドは、変数名の頭に @ マークを付けることで、プログラム側で変更した値が画面に反映されるというものでした。これは「片側」だけの反映であり、単方向のデータバインドです。

双方向データバインドとは、その名の通り両方向、つまりプログラム側で変更した値が画面に反映されるだけでなく、画面側で入力・変更した値もプログラム側に反映される、という仕組みを指します。

単方向データバインドの限界を確認する

まず、これまでのやり方(@ マークによる単方向バインド)では双方向の反映ができないことを、実際に確認してみます。Home.razor の input タグは、これまで value=”AAA” という固定文字列になっていました。

図1 変更前の Home.razor。input タグの value は “AAA” という固定文字列になっている

まず @code ブロックに private string _areaName フィールドを追加します。

図2 @code ブロックに private string _areaName フィールドを追加したところ

@code {
    private string _areaName = "";
    // ...
}

 

続いて、input タグの value 属性を、この _areaName を @ マークでバインドする形に書き換えます。あわせて _areaName の初期値として「高松」を設定しておきます。

図3 input タグの value を @_areaName にバインドしたところ

private string _areaName = "高松";
 
<input type="text" value="@_areaName" class="form-control" />

 

この状態で実行すると、input には初期値の「高松」が表示されます。

図4 実行結果。input に初期値「高松」が表示されている

ここで、画面上の入力欄の値を「姫路」に書き換えてみます。

図5 入力欄の値を「姫路」に書き換えたところ

あらかじめ ShowMeasure() メソッドにブレークポイントを設定しておき、「ボタンで計測画面を開く」ボタンを押してブレークポイントで停止させ、_areaName の値を確認してみます。画面上は「姫路」に書き換えたにもかかわらず、_areaName の値は初期値の「高松」のままになっていることが分かります。

図6 ブレークポイントで停止し _areaName の値を確認すると、画面を「姫路」に書き換えたにもかかわらず初期値の「高松」のままになっている

これが、@ マークによるバインドが単方向(プログラム→画面)にしか効かないということです。画面側で入力した値がプログラム側の変数に反映されていません。

@bind を使った双方向データバインド

双方向にデータバインドしたい場合は、@bind を使用します。先ほどの value=”@_areaName” の部分を、@bind=”_areaName” という形に書き換えます。@bind の右辺側では、_areaName の前に @ マークは付けません。

図7 value=”@_areaName” を @bind=”_areaName” に書き換えたところ

<input type="text" @bind="_areaName" class="form-control" />

 

この状態で再度実行し、入力欄の値を「高松」から「姫路」に書き換えたうえで「ボタンで計測画面を開く」ボタンを押してブレークポイントで停止させると、今度は _areaName の値がきちんと「姫路」に更新されていることが確認できます。

図8 @bind に書き換え後、入力欄を「姫路」に変更してブレークポイントで確認すると、_areaName の値も「姫路」に更新されている

これで、画面側で入力した値がプログラム側の変数にも反映される、双方向のデータバインドができるようになりました。

バインドした値を計測画面へのパラメータとして渡す

ついでに、この _areaName の値を計測画面への遷移パラメータとして渡すこともできます。ShowMeasure() メソッド内の NavigateTo の遷移先文字列を “measure/” + _areaName という形に書き換えます。

図9 NavigateTo の遷移先を “measure/” + _areaName に書き換えたところ

private void ShowMeasure()
{
    //入力チェック
 
    _navigationManager.NavigateTo("measure/" + _areaName);
}

 

実行して入力欄を「姫路」にしたうえでボタンを押すと、URL が https://localhost:7246/measure/姫路 のように _areaName の値がそのままパラメータとして渡り、計測画面の「計測場所」にも「姫路」が表示されることが確認できます。

図10 URL に /measure/姫路 とパラメータが渡り、計測画面の「計測場所」にも「姫路」が表示されている

このように、双方向データバインドは画面からの入力値をそのままプログラムで扱いたい場面で活用できます。ぜひ実際に手を動かして試してみてください。

BlazorでのWebアプリケーション開発手法1【C#】

A01_はじめに
A02_バージョンの確認
A03_プロジェクトの作成
A04_アプリの実行
A05_サンプルプログラムの構成
A06_Razorコンポーネント
A07_Razor構文
A08_@pageでURLを指定する
A09_@rendermode
A10_PageTitle
A11_HTMLの見出し
A12_pタグ
A13_単方向データバインド
A14_単方向データバインドの詳細
A15_Bootstrap
A16_ボタンクリックイベント
A17_イベント引数の受け取り方
A18_ここまでのまとめ
B01_新しいWebページを追加する方法
B02_サイドバーから画面を表示する
B03_サイドバーのアイコンを変更する方法
B04_計測値を表示する
B05_変数に置き換える
B06_最新の値でデータを更新する
B07_@usingで通常のC#コードを呼び出す
B08_画面遷移_aタグ
B09_画面遷移_aタグの見た目をボタンにする
B10_画面遷移_NavigationManagerでの遷移
B11_画面間のパラメータの受け渡し方法
B12_EscapeDataStringでエスケープする
B13_複数のパラメータを渡す
B14_任意のパラメータにする
B15_string以外の型をパラメータで使う方法
B16_DateTime型をパラメータで渡す方法
B17_引数2個のURLも型指定に変更する
B18_パラメータ属性をつけるときの注意点
B19_OnParametersSet
B20_OnInitialized
B21_OnInitializedが2回通る問題の対応
B22_ブラウザが開いている間の値を記憶する方法
B23_値の受け渡しとしてのProtectedSessionStorage
B24_非同期を想定したUIの制御
C01_一覧表示
C02_非同期での一覧表示
C03_table-striped
D01_入力エリア
D02_双方向データバインド
D03_入力データをリアルタイムで通知する方法
D04_placeholder
D05_入力エリアの横幅の調整
D06_テキストチェンジイベントを拾う方法
D07_プルダウン
D08_プルダウンのbootstrap
D09_プルダウンの選択している値をデータバインドで操作する
D10_プルダウンにリストの値を表示する
D11_プルダウンに未選択行を入れる
D12_プルダウンの入力を禁止する
D13_プルダウンのチェンジイベントを取得する
D14_チェックボックス
D15_チェックボックスにラベルを付ける
D16_複数のチェックボックスを並べる
D17_ラジオボタン
D18_ラジオボタンのデータバインド
D19_ラジオボタンのチェンジイベント
D20_ラジオボタンにbootstrapを適応する