2012-02-09 3 views
0

私はWPF/XAMLの私の最初のプロジェクトに取り組んでいますが、私は理解していないことがたくさんあります。コマンドによる通信のユーザーコントロール - 方法

私の問題は簡単です。トップには多数のフィールドがあり、選択基準、取得ボタン、データグリッドを入力するウィンドウが必要です。ユーザーがボタンをクリックすると、クエリが実行され、結果がグリッドに入力されます。

これを実装するためのシンプルで明白で間違った方法は、単一のウィンドウを含む単一のモジュールを持ち、その中にすべてのエントリフィールド、データグリッド、作業を含めることです。そのような種類の責任感は、維持できない混乱を招く。

だから私はレイアウトより少しだけ責任を負うウィンドウがあります。これには、入力フィールドと取得ボタンを含む条件コントロールとデータグリッドを含むデータ表示コントロールの2つのユーザーコントロールが含まれています。

質問は2つの話を互いにどのようにするかです。

年前、基準コントロールに関数ポインタを追加しました。ウィンドウは、表示コントロール内の関数を指すようにウィンドウを設定し、ボタンがクリックされると、選択基準を渡して表示コントロールに呼び出されます。

さらに最近、イベントコントロールを条件コントロールに追加しました。私は、ウィンドウをイベントを聴くためのディスプレイコントロールにハンドラを設定し、ボタンがクリックされたときにイベントを発生させるでしょう。

これらのメカニズムの両方がWPFで機能します。しかしどちらも非常にXAMLishです。私はWPFがこれらの種類の接続問題に対応するためにICommandインターフェイスを提供してくれたように思えますが、実際にどのように動作させるのかはまだ分かりません。私が見た例はどれも、私の単純なシナリオに合っていないようです。

誰も私にこの問題のICommandを適合させる方法についていくつかアドバイスを与えることができますか?それともオンラインでまともな説明を私に指示しますか?

ありがとうございます!

答えて

1

MVVMは、WPFおよびSilverlight開発で使用される一般的なパターンです。あなたはそれを読んでおくべきです。

基本的に、検索を実行するコマンドを公開するビューモデルがあります。同じビューモデルでは、各基準項目のプロパティも公開されます。はい、私はビューモデルを使用してい

public class MyViewModel : ViewModel 
{ 
    private readonly ICommand searchCommand; 
    private string nameCriteria; 

    public MyViewModel() 
    { 
     this.searchCommand = new DelegateCommand(this.OnSearch, this.CanSearch); 
    } 

    public ICommand SearchCommand 
    { 
     get { return this.searchCommand; } 
    } 

    public string NameCriteria 
    { 
     get { return this.nameCriteria; } 
     set 
     { 
      if (this.nameCriteria != value) 
      { 
       this.nameCriteria = value; 
       this.OnPropertyChanged(() => this.NameCriteria); 
      } 
     } 
    } 

    private void OnSearch() 
    { 
     // search logic, do in background with BackgroundWorker or TPL, then set Results property when done (omitted for brevity) 
    } 

    private bool CanSearch() 
    { 
     // whatever pre-conditions to searching you want here 
     return !string.IsEmpty(this.NameCriteria); 
    } 
} 
+0

:あなたのビューモデルは次のようになります

<TextBox Text="{Binding NameCriteria}"/> ... <Button Command="{Binding SearchCommand}".../> ... <DataGrid ItemsSource="{Binding Results}"/> 

:ビュー(複数可)、ビューモデルにさまざまなプロパティにバインドします。それは問題がどこにあるのではないので、私はそれを言及しなかった。私は、表示コントロールのビューモデルでメソッドを定義し、それを実行するコマンドを公開することができます。表示コントロールのビューのUI要素にバインドするのは簡単です。しかし、それは私の問題ではありません。表示コントロールのビューモデルにアクセスできないUIコントロールからコマンドをトリガする必要があります。 –

+0

@Jeff:その場合は、デカップリングされたコンポーネントを共同作業できるイベントアグリゲータを使用してください。プリズムには1つしかないのですが、別の場所から1つをつかむことも、自分で書くこともできます。 –

+0

これは、同じウィンドウ内の2つのコントロールが互いに話すように制約されているため、問題の深刻な過度のようです。 –

関連する問題