web-dev-qa-db-ja.com

MVVMでComboBox SelectionChangedをどのように処理しますか?

純粋なMVVMを実行している場合、コードビハインドに戻らずにComboBox SelectionChangedイベントをどのように処理しますか?

私が試してみた AttachedBehaviors しかしEvent = "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>
31
Edward Tanguay

データトリガーを使用して、「enable/disable、またはvisible/invisible」などの別のUI要素でイベントをトリガーします。

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

3
Peter

この投稿はかなり古いものですが、同じ問題が発生したためです。ここに私がそれを解決した方法があります(フレームワーク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>

次に、ビューモデルにSelectionChangedCommandを実装するだけです。

67
fabien

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

26
HAdes