SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Silverlight 4で作る新しいRIAアプリケーション

MVVMによるSilverlightアプリケーションの開発(その1)

Silverlight4で作る新しいRIAアプリケーション(6)


ダウンロード sample.zip (178.1 KB)

ビューモデル ~ビューとモデルの橋渡し役~

 ビューモデルはサーバ側のドメインモデルに対し、ビューモデルは、ビューの問題を解決するモデルと考えればいいでしょう。ユーザーが画面で入力したデータを一時的に格納したり、検証を行ったり、サーバに対して問い合わせを行い、データの検索や更新を行ったりします。

 ビューモデルの内部を見ていきましょう。

データバインディング

 これまでの連載でも何度か出てきましたが、データバインディングは異なるオブジェクト同士のプロパティの値を同期する仕組みです。例えば図4のようにVisual StudioでXAMLを修正した場合は、XAML側の属性値はプロパティウインドウと同期されているので、どちらかの値を書き換えれば、連動して値が変更されます。

図4 Visual Studioのデザイン画面
caption

 ビューモデルは、ビューの情報をバインドされたビューモデルのプロパティ経由で、ビューの情報を参照します。

 さらに、プログラム内部で値が変更された場合にビューに変更を通知するため、INotifyPropertyChangedインターフェースを実装します。プロパティの値が変更された時はPropertyChangedイベントを発生させ、ビューに値が変更されたことを通知します。リスト2に、INotifyPropertyChangedインターフェースを実装したビューモデルのサンプルを示します。記事上では、SearchIdプロパティ、登録日プロパティ、ISBNプロパティの実装は省略しています。完全なコードはダウンロードサンプルを参照してください。

リスト2 データバインディング(MainPageViewModel.cs)
public class MainPageViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    /// <summary>
    /// 値が変更された際にUIへ変更通知を行います。
    /// </summary>
    public void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    /// <summary>
    /// オブジェクトに対する変更があったかを管理します。
    /// </summary>
    public bool HasChange { get; set; }

    private int? _Id;
    public int? Id
    {
        get { return _Id; }
        set {
            if (_Id == value) return;
            _Id = value;
            // UIに値が変更されたことを通知します。
            RaisePropertyChanged("Id");
        }
    }
    
    private string _タイトル;
    public string タイトル
    {
        get { return _タイトル; }
        set {
            if (_タイトル == value) return;
            _タイトル = value;
            // UIに値が変更されたことを通知します。
            RaisePropertyChanged("タイトル");

            HasChange = true;
        }
    }
    
    ... 略 ...
}

 ここで注意したいのが、Idプロパティがint?型になっている点です。モデルの定義としてはIdプロパティは主キーになっているため、int型の必須項目なのですが、ビューの初期状態では何の値にも設定されてほしくないため、int?としています。このようにビューモデルでは、ビューとモデルの差異を吸収する役目も持っています。

 また、画面にロードされたプロパティに対する変更があったかを管理するHasChangeプロパティを用意しています。

【コラム】値の検証

 ここではスペースの都合上、エンティティの検証処理は省いていますが、本連載の4回目やSilverlight 3連載の7回目で紹介した属性ベースの認証はもちろんMVVMでも利用できます。属性ベースの検証を取り入れることで無駄な検証ロジックを自作する必要がなくなり、プログラムの品質向上が見込めます。適用が可能であれば、できるだけこちらの検証方法を採用するべきでしょう。

 

次のページ
まとめ

修正履歴

この記事は参考になりましたか?

Silverlight 4で作る新しいRIAアプリケーション連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト かるあ (杉山 洋一)(カルア(スギヤマ ヨウイチ))

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5699 2011/02/22 00:07

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー