【課題】ログインの画面を作りたい。
まず画面から作成する。
[ファイル:LoginDialog.xaml]
<Window x:Class="Tutorial.LoginDialog" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="ログイン" SizeToContent="WidthAndHeight"/> <StackPanel> <Label>ユーザー名</Label> <TextBox Width="150px"/> <Label>パスワード</Label> <PasswordBox Width="150px"/> <StackPanel Orientation="Horizontal"> <Button IsEnabled="False">ログイン</Button> <Button>キャンセル</Button> </StackPanel> </StackPanel> </Window>
とりあえず、これで最低限必要なものはそろった。
ビジネスユーザの仕様は以下の通りだとする。
- このビュー(表示画面)はログインIDとパスワードを入力するためのテキストボックスがある。
- ユーザはログインとキャンセルの二つの操作ができる。
- ログインのボタンは、デフォルトで押せないようにする。ユーザがID・パスワードを入力したらボタンが押せるようにする
- ログインを押した後は、非同期的に認証サーバーに問い合わせて、ユーザーのパーミッションの情報などを引き出す
次にコードビハインドを書く。
[ファイル:LoginDialog.xaml.cs]
public partial class LoginDialog { public LoginDialog() { InitializeComponent(); DataContext = LoginDialogViewModel(); } }MVVMにおいては原則、コードビハインドには何も書かない。「ViewModelをDataContextプロパティーにアサインする」部分のみ、コードビハインドに記述する。
最後にもうひとつ.csファイルを作る。
[ファイル:LoginDialogViewModel.cs]
public sealed class LoginDialogViewModel : ViewModelBase { #region Fields private string _loginId; private string _password; #endregion #region Bindable Properties public string LoginId { get { return _loginId; } set { _loginId = value; NotifyPropertyChange("LoginId");} } public string Password { get { return _password; } set { _password = value; NotifyPropertyChange("Password");} } #endregion #region Bindable Commands public ICommand LoginCommand { get; private set; } public ICommand CancelCommand { get; private set; } #endregion public LoginDialogViewModel() { ... } }
なんとなくご覧にいただければわかると思うが、これは先ほどXamlで記述したダイアログが必要とする「情報」と「操作」を平たく抽出していることがわかる。このファイルこそがViewModelで、名前の通りまさに「ViewのためのModel」である。もう一度LoginDialog.xamlに戻って、このViewModelのプロパティーを各Viewの要素にバインドする。
[ファイル:LoginDialog.xaml]
<Window x:Class="Tutorial.LoginDialog" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="ログイン" SizeToContent="WidthAndHeight"/> <StackPanel> <Label>ユーザー名</Label> <TextBox Text="{Binding LoginId}" Width="150px"/> <Label>パスワード</Label> <PasswordBox Password="{Binding Password}" Width="150px"/> <StackPanel Orientation="Horizontal"> <Button IsEnabled="False" Command="{Binding LoginCommand}">ログイン</Button> <Button Command="{Binding CancelCommand}">キャンセル</Button> </StackPanel> </StackPanel> </Window>
バインドはこれで完了。これでユーザがIDを入力するとViewModelのLoginIdの値に自動的にインプットされる、というわけだ。次回は、ViewModelの実装を行う。
以下は、すべてのViewModelの雛形となるViewModelBaseの実装。
[ファイル:ViewModelBase.cs]
public abstract class ViewModelBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void NotifyPropertyChange( string fieldName ) { if( PropertyChanged != null ) { PropertyChanged(this,new PropertyChangedEventArgs(fieldName)); } } }
0 件のコメント:
コメントを投稿