2009-06-04 13 views
27

Per coloro che eseguono MVVM puro, come gestisci un evento SelectionChanged di ComboBox senza ripristinare il codice?Come gestisci un ComboBox SelectionChanged in MVVM?

Ho provato ad es. AttachedBehaviors ma evento = "SelectedChanged" non è supportata:

<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> 

risposta

3

Si potrebbe utilizzare un trigger di dati per attivare un evento su un elemento dell'interfaccia utente diverso, come "abilitare/disabilitare, o visibile/invisibile"

Se si desidera che l'elemento selezionato mostri i dati dell'oggetto in altri elementi dell'interfaccia utente, quindi si utilizzerà il binding dei dati e si imposta il datacontext degli elementi di visualizzazione dei dati dell'interfaccia utente da associare all'elemento attualmente selezionato nella casella combinata.

+0

ok, potrei farlo se tutto quello che voglio fare è cambiare lo XAML, ma cosa succede se voglio ad es. usa una comboxbox per eseguire codice che fa qualcosa che XAML non può fare, ad es. caricare un nuovo file di risorse e collegarlo alla finestra corrente? o per es. modificare alcuni dati nel database, ecc. –

+0

Quindi è possibile utilizzare un binding del View Model alla casella combinata SelectionChanged. Non sono sicuro di dove cercare un esempio, ma Karl Shifflet e Josh Smith sono i due blog principali su cui vado MVVM per aiutare i link ai loro blog. http://karlshifflett.wordpress.com/2009/06/03/troubleshooting-silverlight-3-broken-bindings/ http://joshsmithonwpf.wordpress.com/2009/05/20/device-specific- interaction-logic-in-an-mvvm-application/ Mi spiace non posso aiutare di più sulle specifiche, sono abbastanza nuovo a WPF e MVVM me stesso. – Peter

+0

oops ha dimenticato di menzionare Karl Shifflet ha fatto un sacco di eventi Line of Business WPF, guarda sul suo blog per loro, contengono alcuni esempi powerpoint eccellenti e anche esempi di codice. – Peter

25

Non sono sicuro che ciò che si sta cercando sia possibile, ma il modo in cui lo faccio è semplicemente associare l'oggetto SelectedItem a una proprietà sul modello di visualizzazione. Quindi all'interno del setter della proprietà, chiamo qualsiasi codice personalizzato che voglio accadere, ad esempio l'impostazione di altre proprietà in base alla regola. Se ho bisogno che l'oggetto selezionato venga associato a un oggetto (per gli altri controlli rilegati da aggiornare), lo imposto anche nel setter e invio una notifica.

+0

Penso che in questo modo abbia più senso, e funziona così bene per me finora. Grazie per aver postato questo. – Aphex

+3

Trovo che questo sia un modo incredibilmente doloroso per farlo. Per le applicazioni semplici, fare questo invece di un comando è facile. Ma diventa rapidamente ingombrante. Le proprietà dovrebbero contenere dati, non eseguire azioni. Si interrompe in modo asincrono e rende più difficile eseguire il debug in quanto Visual Studio passerà sopra i setter/getter di proprietà per impostazione predefinita. –

53

Questo post è piuttosto vecchio, ma poiché ho avuto lo stesso problema. Ecco come l'ho risolto (usando framework 4.0): l'idea è di usare System.Windows.Interactivity.

In XAML:

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

Poi basta necessità di attuare il SelectionChangedCommand nel vostro ViewModel.

+0

Inoltre c'è 'CallMethodAction' se non è necessario un comando' Comando', anche se richiede l'aggiunta di ref a 'Microsoft.Expression.Interactions.dll' – markmnl

+1

e come si collegherebbe' SelectedItem' o 'SelectedValue' di' ComboBox' qui senza dargli un nome? – Maslow

+0

@Maslow o chiunque altro desideri passare l'elemento selezionato come parametro: utilizza l'associazione, vedere [qui] (https://stackoverflow.com/a/34668511/63209). Nel mio caso, ho chiamato il 'ComboBox', ad es." MyCombo ", e quindi il binding era un semplice' {Binding ElementName = MyCombo, Path = SelectedItem} '. – Paul

Problemi correlati