2011-12-23 9 views
1

ビューモデルを使用してxamlビューにコマンドをバインドする単純なMVVMアーキテクチャがあります。私のコマンドはかなり一般的なので、それらを2つのビューにバインドするので、私はそれらをICommandインターフェイスを実装する独自のクラスに入れました。ビューモデルの中に私はそういう公共アクセサーを持っています:ビューモデルを使用してXAMLビューにコマンドクラスを公開する方法

private ICommand _myCommand; 
    public ICommand MyCommand 
    { 
     get 
     { 
      if (_myCommand == null) 
      { 
       _myCommand = new MyCommand(_injectedModel); 
      } 

      return _myCommand ; 
     } 
    } 

これはすべて機能していますが、私はこれらの機能がたくさんあります。それらはすべて大雑把に同じことを行います。コマンドを公開プロパティとして公開し、プライベートコマンドが既に存在するかどうかを確認し、そうでない場合は新しいコマンドを作成します。それは私の味のための少し "定型句"です。

私はこれを抽象化するための良い方法が欲しいです。何らかのコマンドマップからの識別子に基づいてコマンドを検索するメソッドを作成することができました。私はビューモデルのコンストラクタですべてのコマンドを作成することができます(遅延的に行うのではなく)。

あなたはベストプラクティスをどのように考えますか?各ビューモデル内で新しいコマンドをインスタンス化するのを避け、中心的なコマンドルックアップを持つべきですか?

+1

「return _myCommand ??」の構文でこれを統合することができます。 (_myCommand = new MyCommand(_injectedModel)); ' – Jay

答えて

1

私は、ビューモデルコンストラクタですべてのコマンドを作成することができます(遅くするのではなく)。

私はこれをよくします。コマンドのコストは、ほとんどの実装ではかなり安いです。実装に応じて、単一のデリゲート参照(またはデリゲート参照のペア)を持つ小さなクラスである可能性があります。これは、怠け者の建設を保証するのに十分なオーバーヘッド、IMOであることはまずありません。あなたがCaliburn.Microを探しているように見える

// Constructor 
public MyViewModel() 
{ 
    this._injectedModel = SetModel(); 

    this.MyCommand = new MyCommand(_injectedModel); 
} 

ICommand MyCommand { get; private set; } 
+0

これは確かにこのように多くのクリーナーです。私はいくつかのIoCフレームワークについても調べていますので、私のモデルを回るのを避けることができます。そのようなフレームワークに私のコマンドを移すかもしれません。私はあなたがコマンドのサイズが余分なインスタンス化について心配しないように十分小さいと思っています - とにかくステートレスとしてそれらを保っています。 –

0

私はしばしばとしてこれを書きます。 ViewModelメソッドをXAMLのx:Nameにマップします。
コマンドの "定型文"コードはもう必要ありません。

例:

<Button x:Name="Save" /> 

が呼び出す:

ボタンクリックで
public void Save() 
{ 
    //Save logic 
} 


私はどのコマンドも作成していないことに注意してください。

これは非常に簡単な例です。コールにパラメータを追加して、Clickとは異なるイベントを使用できるようにすることができます。

+0

私はまったくやりたいことではありません。私は、コマンド実行をviewModelに委託したくありません。複数のviewModelで再利用できるように、コマンドの別々のクラスが必要です。すべてのロジックがビューまたはviewModelに戻ってしまった場合、MVC(またはMVVM)を実行する点は何ですか?私はあなたが持っているものをやりたければXAML Clickプロパティを使うだけです。 –

+0

MVVMはViewModelにロジックを入れています。コマンド用に別のクラスが必要な場合は、静的コマンドをチェックしてください。イベントを別のクラスにルーティングすることもできます。 –

関連する問題