2009-06-04 13 views
27

純粋なMVVMを行っている人にとっては、コードバックに戻らずにComboBox SelectionChangedイベントをどのように処理しますか?MVVMでコンボボックスSelectionChangedをどのように処理しますか?

AttachedBehaviorsしかし、イベント=サポートされていません「SelectedChanged」:場合

<ComboBox> 
    <ComboBoxItem Content="Test1"> 
     <c:CommandBehaviorCollection.Behaviors> 
      <c:BehaviorBinding Event="SelectionChanged" 
           Command="{Binding SelectedChanged}" 
           CommandParameter="MainBorder123"/> 
     </c:CommandBehaviorCollection.Behaviors> 
    </ComboBoxItem> 
    <ComboBoxItem Content="Test2"/> 
    <ComboBoxItem Content="Test3"/> 
</ComboBox> 

答えて

3

次のようなさまざまなUI要素にイベントをトリガするデータトリガを使用することになり、「有効化/無効化、または可視/不可視の」

選択した要素に他のUI要素のオブジェクトデータを表示させ、データバインディングを使用し、UIデータ表示要素のデータコンテキストをコンボボックス内の現在選択されている項目にバインドするように設定します。

+0

大丈夫ですが、私がやりたいことがXAMLを変更するだけであれば、私はそれを行うことができます。 comboxboxを使用して、XAMLでは実行できないコードを実行します。新しいリソースファイルを読み込んで現在のウィンドウに添付しますか?例えば、データベースなどの一部のデータを変更します。 –

+0

次に、ビューモデルをコンボボックスSelectionChangedにバインドすることができます。 例を探す場所はわかりませんが、Karl ShiffletとJosh SmithはMVVMのためのブログの2つのメインブログです。ブログへのリンクは以下のとおりです。 http://karlshifflett.wordpress.com/2009/06/03/troubleshooting-silverlight-3-broken-bindings/ http://joshsmithonwpf.wordpress.com/2009/05/20/device-specific-対話ロジック - in - an - mvvm - アプリケーション/ 申し訳ありませんが、詳細については私が助けることはできません、私はかなりWPFとMVVM自分自身新しいです。 – Peter

+0

Karl Shiffletは、WPF Line OF Businessイベントをたくさんやっていて、彼のブログを見ていて、優れたパワーポイントの例とコードサンプルも含んでいます。 – Peter

25

あなたの後のことが可能かどうかはわかりませんが、私がやる方法はSelectedItemをビューモデルのプロパティに単にバインドすることです。次に、プロパティ設定ツール内で、ルールに基づいて他のプロパティを設定する、つまりカスタムコードを呼び出します。選択したアイテムをオブジェクトにバインドする必要がある場合(他のバインドされたコントロールを更新する場合)、これもセッターで設定し、通知を送信します。

+0

私はこの方法が最も理にかなっていると思っています。これを投稿していただきありがとうございます。 – Aphex

+3

私はこれを行うには非常に痛い方法であることがわかります。簡単なアプリケーションでは、コマンドの代わりにこれを行うのは簡単です。しかし、それはすぐに扱いにくくなります。プロパティはデータを保持し、アクションは実行しません。これは非同期を破り、Visual Studioがデフォルトでプロパティセッター/ゲッターを処理するので、デバッグがより困難になります。 –

53

この投稿はかなり古いですが、私は同じ問題を抱えています。ここで私はそれを解決する方法です(フレームワーク4.0を使用して):アイデアはSystem.Windows.Interactivityを使用することです。 XAMLで

<ComboBox ItemsSource="{Binding Items}"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ComboBox> 

その後、あなたは自分のviewmodelにSelectionChangedCommandを実装する必要があります。

+0

また、 'Microsoft.Expression.Interactions.dll'にrefを追加する必要はありますが、' Command'が不要な場合は 'CallMethodAction'があります。 – markmnl

+1

と、' SelectedItem'や 'SelectedValue'を' ComboBox'ここに名前を付けずに? – Maslow

+0

@Maslowまたは選択した項目をパラメータとして渡すことを望んでいる人は、バインディングを使用します。[here](https://stackoverflow.com/a/34668511/63209)を参照してください。私の場合は、「MyCombo」などの「ComboBox」という名前を付けて、バインディングは単純な「{Binding ElementName = MyCombo、Path = SelectedItem}」でした。 – Paul

関連する問題