Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9555

Caliburn.Microを用いてWPFアプリケーションを作成する(2)

$
0
0

TextBoxをViewModelと紐づけ、さらにTextBlockに表示させる

概要

WPF in C# with MVVM using Caliburn Microの22分目あたりからを参考に、Caliburn.Microを用いてWPFアプリケーションを作成する(1)で作った空ウィンドウにテキストを表示させてみる。

完成形

テキストボックスと連動した文字列表示ができる次のようなウィンドウを作る。
image.png

まずは簡単な文字列表示

空ウィンドウを準備し、View編集

前回の続き。
WPFプロジェクトで空ウィンドウが出るまでを作成。

ViewModelにプロパティをセット

ShellViewModel.csを開き、'propfull'とタイプ後、タブキーを2回押しSnippet展開(↓のようになる)。

挿入されたコード
privateintmyVar;publicintMyProperty{get{returnmyVar;}set{myVar=value;}}

動画にあわせて、snippetを編集。FirstNameプロパティを作成する。

Viewにテキストを追加

つづいてShellView.xamlを編集する。
動画のとおり、VisualStudioの編集画面を横並びにしてみる。

image.png

TextBlockタグを置き、文字列表示

動画のとおりに Gridタグ内に、Grid.ColumnDefinitions, Grid.RowDifinitionsを記述。
1,1のセル(?)部分に、TextBlockを配置。要素内に何らかの値を入れてみる。
ウィンドウのプレビューを確認。

ViewModelへの接続

続いて、TextBlock内に入れた文字列を消し、x:Nameを設定する。

ShellView.xaml
<TextBlockx:Name="FirstName"Grid.Row="1"Grid.Column="1"></TextBlock>

テスト実行 (何も変わらない)

ここで実行しても、ウィンドウは空白のままで、TextBlockの内容は表示されない。
なぜなら先ほど設定したShellViewModelのプロパティに何も値がはいっていないため。

ShellViewModelに初期値を設定する

_firstName宣言部に、初期値を入れる。

ShellViewModel.cs(抜粋)
privatestring_firstName="hoge hoge";

ここで実行すると、ViewModelの内容がバインドされて表示される。

テキストボックスの作成

TextBoxの作成

つづいてTextBoxをTextBlockの下に作成してみる。
x:Nameで同じものが作れないことを味わってみる。
元Windowのプロパティ WindowStartupLocationを Manual→CenterScreenに変更してみる(このあたりは動画のとおりに触ってみる)

次のようにShellView.xamlを編集する。

ShellView.xaml(抜粋)
<TextBlockText="{Binding Path=FirstName, Mode=OneWay}"Grid.Row="1"Grid.Column="1"></TextBlock><TextBoxMinWidth="100"Grid.Row="2"Grid.Column="1"x:Name="FirstName"></TextBox>

この状態で実行しても、プロパティ初期値は表示されるが、TextBoxの内容とはひもづいてないので、入力しても変化はない。

プロパティの変化をViewに伝える

ShellViewModel.csのsetに 'NotifyOfPropertyChange' を追加する。

ShellViewModel.cs
usingCaliburn.Micro;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceWPFtut01.ViewModels{publicclassShellViewModel:Screen{privatestring_firstName="hoge hoge";publicstringFirstName{get{return_firstName;}set{_firstName=value;NotifyOfPropertyChange(()=>FirstName);}}}}

テスト実行(TextBox連携確認)

この状態で実行すると、変更が通知され、TextBoxの内容がTextBlockと連携される。

image.png

LastNameを追加する

ShellViewModel内に、FirstNameと同様にLastNameを追加する。

FirstNameとLastNameを表示するFullNameを追加する

さらにFullNameを追加する。
FullNameは、FirstNameあるいはLastNameのいずれかが変化したときに追従しないといけないので、Notify部分は両方適用されるように編集する。

ShellViewModel.cs(抜粋)
publicstringFirstName{get{return_firstName;}set{_firstName=value;NotifyOfPropertyChange(()=>FirstName);NotifyOfPropertyChange(()=>FullName);}}publicstringLastName{get{return_lastName;}set{_lastName=value;NotifyOfPropertyChange(()=>LastName);NotifyOfPropertyChange(()=>FullName);}}publicstringFullName{get{return$"{FirstName}{LastName}";}}

Viewの表示を変更する

TextBlockにFullNameを表示、TextBoxでFirstName, LastNameを編集できるようにする。

ShellView.xaml(抜粋)
<TextBlockText="{Binding Path=FullName, Mode=OneWay}"Grid.Row="1"Grid.Column="1"></TextBlock><TextBoxMinWidth="100"Grid.Row="2"Grid.Column="1"x:Name="FirstName"></TextBox><TextBoxMinWidth="100"Grid.Row="2"Grid.Column="2"x:Name="LastName"></TextBox>

FullNameが表示されるかテスト実行

FirstNameとLastNameが合体したFullNameが表示されることを確認する。

image.png

Gridのレイアウト修正を行う

1列目にFullName表示すると、はみ出す場合があるので、Grid.ColumnSpanを設定し、2セル分つかうようにしてみる。

image.png

まとめ

  • ViewModelで設定したプロパティは、Xaml上にText="Binding Path=~"やx:Name=""の形で呼び出せる
  • 変更は NotifyOfPropertyChange(()=>プロパティ); で通知する

次の記事: Caliburn.Microを用いてWPFアプリケーションを作成する(3)


Viewing all articles
Browse latest Browse all 9555