スポンサーサイト

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

対Window用ViewModelをとりあえず作るか。

WPFで何かを作るにも、必ずウィンドウを作る。MVVMパターンで行くなら、まずそのウィンドウ用のVMが必要になる。というわけで、Window用、正確には、その中身(Content)用のVMを作る。まあ、これはPageクラスの事も考えているだけ。

using System;
using System.Collections.Generic;
using System.Linq;

namespace TawamureDays {

/// <summary>
/// ウィンドウ用ViewModelの基底クラス
/// </summary>
public class BaseWindowVM : BaseViewModel {

#region コンストラクタ

/// <summary>
/// コンストラクタ
/// </summary>
public BaseWindowVM() : base() {
}

#endregion
}
}

BaseWindowViewModelでもいいんだけど、長いからViewModelをVMに略してBaseWindowVM。
この前作ったBaseViewModelを基底クラスにしている。
さてさて次に何を作るか。
ウィンドウ、ページ系だから、
・ロード時に呼び出されるメソッド
・アンロード時に呼び出されるメソッド
・終了時に呼び出されるメソッド
かな。
○ロード時に呼び出されるメソッド

/// <summary>
/// Loadedイベント発生時のメソッド
/// </summary>
/// <param name="parameter">パラメータ</param>
protected virtual void OnLoaded(object parameter) {
}


○アンロード時に呼び出されるメソッド

/// <summary>
/// Unloadedイベント発生時のメソッド
/// </summary>
/// <param name="parameter">パラメータ</param>
protected virtual void OnUnloaded(object parameter) {
}


○クロース時に呼び出されるメソッド

/// <summary>
/// Closingイベント発生時のメソッド
/// </summary>
/// <param name="parameter">パラメータ</param>
protected virtual void OnClosing(object parameter) {
}

virtualなのは、派生クラスでオーバーライドするため。
当然の事ながら、これだけではどうにもならない。イベントと連携するためにコマンドを実装する。
①宣言

/// <summary>Loadedイベント用コマンド</summary>
private RelayCommand loadedCommand_;

/// <summary>
/// Loadedイベント用コマンドを取得します。
/// </summary>
public ICommand LoadedCommand {
get {return loadedCommand_;}
}

/// <summary>Unloadedイベント用コマンド</summary>
private RelayCommand unloadedCommand_;

/// <summary>
/// Unloadedイベント用コマンドを取得します。
/// </summary>
public ICommand UnloadedCommand {
get {return unloadedCommand_;}
}

/// <summary>Closingイベント用コマンド</summary>
private RelayCommand closingCommand_;

/// <summary>
/// Closingイベント用コマンドを取得します。
/// </summary>
public ICommand ClosingCommand {
get {return closingCommand_;}
}

↓の様には宣言しない。

/// <summary>
/// Loadedイベント用コマンドを取得します。
/// </summary>
public ICommand LoadedCommand {
get; private set;
}

内部変数が隠れてしまう為、終了時の後処理ができないから。

②インスタンス生成
コンストラクタでインスタンスを生成する。

/// <summary>
/// コンストラクタ
/// </summary>
public BaseWindowVM() : base() {
loadedCommand_ = new RelayCommand(OnLoaded);
unloadedCommand_ = new RelayCommand(OnUnloaded);
closingCommand_ = new RelayCommand(OnClosing);
return;
}

なお、↓の様に実装するとなにかとよろしくないらしい。

/// <summary>
/// Loadedイベント用コマンドを取得します。
/// </summary>
public ICommand LoadedCommand {
get {
if (this.IsDisposed) {
return null;
}

if (loadedCommand_ == null) {
loadedCommand_ = new RelayCommand(this.OnLoaded);
}
return loadedCommand_;
}
}

・クリアした後にこのプロパティを呼び出すと、インスタンスを作ってしまう。
・どうもget内でインスタンスを作るというのがDataBindingするプロパティとしてよろしくない(リークの元)。

③後始末
放ったらかしはリークの元だしね。

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

base.OnDispose(disposing);

if (disposing) {
//終了処理
if (loadedCommand_ != null) {
loadedCommand_.Clear();
loadedCommand_ = null;
}

if (unloadedCommand_ != null) {
unloadedCommand_.Clear();
unloadedCommand_ = null;
}

if (closingCommand_ != null) {
closingCommand_.Clear();
closingCommand_ = null;
}
}
}

長くなったので一旦切る。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


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

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

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

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

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