FC2ブログ

スポンサーサイト

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

コマンドクラスのリメイク(壱)

WPFかつMVVMパターンでアプリを実装しようと思えば、何はともあれほしいのが、コマンドクラスだ。
これがないとつまずくのに、標準で提供されないという(ストアアプリのテンプレートにはあるようだ)。
昔、そんな感じで書いてたな。

MVVMに必須なCommandクラスを作る。
多重実行対策用コマンドを作る。

コマンドクラスには、同期的に処理するタイプと、非同期的に処理するタイプが必要になる。連続で実行されても問題ないときは前者、実行されたくないときは後者が必要になる。
仕事で使っている非同期型コマンドクラスは、BackgroundWorkerを使って実装している。特に不都合はないのだが、仕事では使えないC#5.0以降で作りたくなった。
以下、実装したクラス
・ICommandを拡張したインターフェース
・スレッドセーフにアクセスするためのクラス
・汎用抽象クラス
・同期型コマンドクラス
・Awaitableなクラス
・非同期型コマンドクラス
・ICommandを拡張したインターフェース
 WPFで使うコマンドクラスは、ICommandインターフェースを実装することが最低条件となる。
 なのだけど、開発で使っていくと、どうしてもそれ以上が欲しくなった。
using System;
using System.Windows.Input;

namespace Tawamuredays.Commands {

/// <summary>
/// コマンド用 インターフェース(拡張版)
/// </summary>
public interface ICommandEx : ICommand {

#region プロパティ

/// <summary>
/// 実行中かどうかを取得|設定します。
/// </summary>
bool NowExecuting {get;}

/// <summary>
/// 同期処理が必要かどうかを取得|設定します。<br/>
/// </summary>
/// <remarks>
/// バックグラウンドで呼び出されるようなときに、falseに設定します。<br/>
/// </remarks>
bool NeedSync {get; set;}

#endregion

#region メソッド

/// <summary>
/// 内部データをクリアします。<br/>
/// </summary>
void Clear();

/// <summary>
/// CanExecuteChanged イベントを発生させます。<br/>
/// </summary>
void RaiseCanExecuteChanged();

#endregion
}
}

NowExecutingプロパティ
 実行中かどうかを取得するためのプロパティ。コマンドの実行可否を評価する際に必要になる。多重実行を防ごうと思えば必須。
NeedSyncプロパティ
 別プロセス上で実行されるコマンドでは、Dispatcher.Invokeを実行すると、エラーになることがあった。
Clearメソッド
 内部データ(Action)の参照をクリアするためのメソッド。Clearしないと、メモリーリークしそう。
RaiseCanExecuteChangedメソッド
 CanExecuteChangedイベントを発生させるためのメソッド。意図的にイベントを発生したい時がどうしてもあった。
(続く)
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


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

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

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

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

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