2012-01-01 10 views

risposta

18

Preferisco utilizzare un'associazione allo SelectedItem e implementare qualsiasi funzionalità nell'impostazione della proprietà di associazione.

<ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" /> 

...

public class ViewModel 
{ 
    public IEnumerable<Item> Items { get; set; } 

    private Item selectedItem; 
    public Item SelectedItem 
    { 
     get { return selectedItem; } 
     set 
     { 
      if (selectedItem == value) 
       return; 
      selectedItem = value; 
      // Do logic on selection change. 
     } 
    } 
} 
+0

Consiglio eccellente, grazie – James

+0

Funzionerà con Selezione multipla? – Simsons

+0

@Simsons Solo se si dispone di un modo per eseguire il binding alla selezione multipla. Credo che la proprietà SelectedItem venga ignorata durante la selezione multipla. –

0

Suggerirei di utilizzare RelayCommand. Utilizzare lo MVVM Light Toolkit o utilizzare semplicemente le classi RelayCommand e CommandManager da Josh Smith's implementations. Io personalmente uso solo le due classi, quindi non ho bisogno dell'intero toolkit.

Mentre funzionerà sicuramente, ci potrebbe essere un modo più semplice a seconda di ciò che si sta facendo. Potrebbe essere più semplice associare un oggetto allo ListBox allo ListBox e attendere che quel valore cambi.

+0

Grazie a tutti voi per l'aiuto) Buon anno !!! –

2

In pratica dovete alcune opzioni:

  1. utilizzare la SelectedItem proprietà di ListBox per associare a una proprietà nel backend (cioè in vista del modello) ed eseguire la logica nel setter come descritto da Cameron MacFarland.
  2. Utilizzare una libreria di terze parti che ha un evento generico per comandare un comportamento come nel collegamento pubblicato da Pedro Lamas.
  3. Se non si desidera utilizzare librerie di terze parti o scrivere la logica all'interno del setter di proprietà è in qualche modo inaccettabile che sia possibile creare il proprio comportamento per il controllo ListBox. Sottoscrivere l'evento SelectionChanged del controllo e eseguire un comando (il comando potrebbe essere una proprietà di dipendenza esposta dal comportamento).
15

Questo è il modo in cui si può raggiungere la selezione cambiato eventi nella vostra MVVM applicazioni prima di tutto vi dico che Command proprietà funziona solo in Button ora dobbiamo esplicitamente vincolante che la proprietà nella nostra selezione evento Changed come casella di riepilogo o casella combinata nel tuo Xmal presentare

<ListBox Name="MyListBox" ItemsSource="{Binding ListItems}" Height="150" Width="150" Margin="281,32,-31,118"> 

     <Local:Interaction.Triggers> 
      <Local:EventTrigger EventName="SelectionChanged"> 
       <Local:InvokeCommandAction Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=MyListBox,Path=SelectedItem}"/> 
      </Local:EventTrigger> 
     </Local:Interaction.Triggers> 
    </ListBox> 

per questo si deve aggiungere Syatem.Windows dll.Interattività ora u necessario aggiungere i riferimenti nel file dello spazio dei nomi XAML come

xmlns:Local="clr-namespace:System.Windows.Interactivityassembly=System.Windows.Interactivity" 

nella classe ViewModel è necessario definire il vostro comando nella struttura Con

public ViewModel123() 
    { 
     MyCommand = new RelayCommand<string>(TestMethod); 

    } 

ora creare il metodo TestMethod che può gestire il selezione modificata evento

private void TestMethod(string parameter) 
    { 
     MessageBox.Show(parameter); 
    } 

spero che questo possa aiutarti.

+0

Preferisco in questo modo perché penso sia più pulito. –