スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

ViewModelの基底クラスを作る。

MVVMパターンで必ず作るViewModelクラス。ViewModelを作るには、たいていINotifyPropertyChanged インターフェースを実装する必要がある。単純に実装するだけなら、↓のようになる。

using System;
using System.ComponentModel;

namespace TawamureDays {

/// <summary>
/// ViewModel基底クラス
/// </summary>
public class BaseViewModel : INotifyPropertyChanged {

#region INotifyPropertyChangedメンバ

/// <summary>プロパティ値変更イベント</summary>
public event PropertyChangedEventHandler PropertyChanged;

#endregion
}
}

でも、このインターフェースは、PropertyChangedイベントしか要求しない。
これだけで基底クラスというには、足りなさすぎる。
というわけで、継承したサブクラス内で使うメソッドを実装する。

using System;
using System.ComponentModel;

namespace TawamureDays {

/// <summary>
/// ViewModel基底クラス
/// </summary>
public class BaseViewModel : INotifyPropertyChanged {

#region INotifyPropertyChangedメンバ

/// <summary>プロパティ値変更イベント</summary>
public event PropertyChangedEventHandler PropertyChanged;

#endregion

#region protectedメソッド

/// <summary>
/// 指定されたプロパティ名で値変更を通知します。
/// </summary>
/// <param name="propertyName">プロパティ名</param>
protected void NotifyPropertyChanged(string propertyName) {
if (PropertyChanged != null) {
((PropertyChangedEventHandler)PropertyChanged)(
this, new PropertyChangedEventArgs(propertyName));
}
}

#endregion
}
}

NotifyPropertyChangedメソッドは明示的に変更を通知するメソッド。
基本的に、イベント発生はそのクラスの責任なので、protectedにしている。
PropertyChangedは、PropertyChangedEventHandlerにキャストする必要がある。
もう1つ実装しておきたいのが、IDisposableインターフェース。Windows.Formsではおなじみだけど、WPF4のコントロールにはあまり実装されていない。ただし、ViewModel側では、実装が必要だと思う。IDisposableは、後始末には最適なインターフェースなので。後始末をきちんとしないと、メモリリークの元になる。
で、IDisposable実装も含めた結果は以下のような感じ。

using System;
using System.ComponentModel;

namespace TawamureDays {

/// <summary>
/// ViewModel基底クラス
/// </summary>
public class BaseViewModel : INotifyPropertyChanged, IDisposable {

#region コンストラクタ

/// <summary>
/// コンストラクタ
/// </summary>
public BaseViewModel() {

}

#endregion

#region デストラクタ

/// <summary>
/// デストラクタ
/// </summary>
~BaseViewModel() {
this.OnDispose(false);
return;
}

#endregion

#region INotifyPropertyChangedメンバ

/// <summary>プロパティ値変更イベント</summary>
public event PropertyChangedEventHandler PropertyChanged {
add {PropertyChangedHandler += value;}
remove {PropertyChangedHandler -= value;}
}

/// <summary>
/// プロパティ変更イベントハンドラ<br/>
/// 内部でのみ使用可能<br/>
/// </summary>
protected PropertyChangedEventHandler PropertyChangedHandler {
get; set;
}

#endregion

#region protectedメソッド

/// <summary>
/// 指定されたプロパティ名で値変更を通知します。
/// </summary>
/// <param name="propertyName">プロパティ名</param>
protected void NotifyPropertyChanged(string propertyName) {
if (this.IsDisposed) {
return;
}

if (this.PropertyChangedHandler != null) {
this.PropertyChangedHandler(this,
new PropertyChangedEventArgs(propertyName));
}
}

#endregion

#region IDisposableメンバ

/// <summary>
/// 開放処理されたかどうかを取得|設定します。
/// </summary>
public bool IsDisposed {
get; protected set;
}

/// <summary>
/// 内部リソース解放処理を行います。<br/>
/// 参照系の内部変数をnullに初期化したり、
/// イベントからハンドラメソッドを削除します。
/// </summary>
public void Dispose() {
try {
this.OnDispose(true);
} catch (Exception) {
//Disposeメソッドから例外を発生させては駄目なので、
//ここで押さえ込みます。
}
return;
}

/// <summary>
/// 内部リソース解放処理を行います。<br/>
/// </summary>
/// <param name="disposing">false:アンマネージドリソースのみ解放する</param>
protected virtual void OnDispose(bool disposing) {
if (this.IsDisposed) {
return;
}

this.IsDisposed = true;

if (disposing) {
if (this.PropertyChangedHandler != null) {
foreach (PropertyChangedEventHandler h in
this.PropertyChangedHandler.GetInvocationList()) {
this.PropertyChanged -= h;
}
}
}
}

#endregion
}
}

PropertyChangedイベントの内部変数として、PropertyChangedEventHandlerを実装している。
IDisposableインターフェース用にIsDisposed変数(Disposeしたかどうかのフラグ)と、OnDisposeメソッド(サブクラスでオーバーライドする為のメソッド)を実装した。
OnDisposeの中では、PropertyChangedイベントに登録されたハンドラを削除している。
Diposeメソッド内では、例外を外部に出してはダメなので、try/catchで外部に漏らさないようにしている。基底クラスなので、これくらいの実装かなと。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。