スポンサーサイト

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

画面の起動はビューの仕事らしい(壱)

 MVVMを使ってて悩む事には、メッセージボックスの表示実装の他に、画面の起動というものもある。
 MVVMでは、画面の起動というものは、ビュー(V)の仕事であるらしく、ViewModel側でWindowのインスタンス生成や、ShowDialogメソッド呼び出しなんてコードを書いてはいけません、という暗黙の縛りがある。まあ、縛りなんかなくても、ViewModelクラス内でそういうのはなんとなくもやっとする。Livetなんかでは、InteractionMessageTriggerなんかを駆使して起動するらしい
 Livetを使わっていない仕事用開発では、これ(画面起動)もまたコマンドクラスの実装でどうにかする事にした。CommandのExecuteを実行することで、画面を起動させる。このコマンドをバインドする事でView側からも実行できる。ただ、これは単にコマンドをかぶせただけで、View側に持って行きましたなんて言える物でもない。で、個人的に改めて検討する事にして、このあたりをコントロール化してView(XAML)側に埋め込めないものかと考えた(仕事では、一度実装して動き出したものは、おいそれと入れ替えることはできない。影響範囲が広くなればなるほど、再テストのコストが大きくなり、入れ替える事によるメリットが、そのコストを上回らない限りGoサインはでない)。
 で、ICommandインターフェースを実装するのは変えないけど、XAMLにも配置できるよう、FrameworkElementクラスを継承するようにしてみた。FrameworkElementにしたのは、Loadedイベント、Unloadedイベントがあるのがこのクラスだからである。
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;

namespace TawamureDays.Controls {

/// <summary>
/// TawamureDays 画面起動用コントロール
/// </summary>
public class StartWindowAction : FrameworkElement, ICommand {

#region コンストラクタ

/// <summary>
/// staticコンストラクタ
/// </summary>
static StartWindowAction() {
//fフォーカスをあてない
FocusableProperty.OverrideMetadata(typeof(StartWindowAction),
new FrameworkPropertyMetadata(false));
//表示しない
VisibilityProperty.OverrideMetadata(typeof(StartWindowAction),
new FrameworkPropertyMetadata(Visibility.Collapsed));
return;
}

/// <summary>
/// コンストラクタ
/// </summary>
public StartWindowAction() {
return;
}

#endregion
}
}
FrameworkElementでもあるので、XAMLに配置できる。
<tw:StartWindowAction x:Name="StartWindow1"/>

ICommandを継承することで、ボタンのCommandプロパティにバインドさせることはできる。
<Button Content="Window2起動"
Command="{Binding ElementName=StartWindow1}"
/>

ただ、この画面を起動するにも、色々な条件が重なる時があり、人(お客)によっては、

表示もできないのに、押せるような状態にするな!

と言われる事がある。まあ、それ(無効化)をしたらしたで、

なんで押せないのかがわからない(押せるようになる条件がわからない)。

とも言われるので、どっちもどっちなんだけど。
で、このコントロールにはまだまだ機能が足りない。必要な物をプロパティで定義し、開発者に用意させる。

・起動するWindowのクラスタイプ(System.Type)
・起動するウィンドウのモード(Modalか、Modelessか)。

これが最低限かな。後は、
・実行前(表示前)の処理
・実行後(画面終了後)の処理
を呼び出し側でできるようにする事か。
 起動前の処理は、呼び出し元から呼び出し先に渡す情報があるときに使う。よくあるのは、一覧画面から詳細画面を呼ぶようなとき。どのデータに関する詳細を表示するかを指定するのに、ユニークであるIDを渡したりする。
 実行後は、実行結果を元に呼び出し元で処理する必要があるときに使う。例えば、編集画面で保存実行→成功→呼び出し元の一覧にある当該データのないようを更新する、とか。
とりあえず、画面の起動と終了は、View側という事になるだろうか。ぼちぼち作っていくか。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


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

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

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

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

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