2010-03-24 10 views
13

Ho un WPF ListBox che vorreiDatabinding un ListBox con SelectionMode = multipla

  • Abilita selezione multipla nel ListBox e
  • DataBind ListBox al mio modello di vista.

Questi due requisiti sembrano essere incompatibili. Il mio modello di vista ha una proprietà ObservableCollection<T> da associare a questo ListBox; Ho impostato un'associazione in XAML dalla proprietà alla proprietà ListBox.SelectedItems. Quando ho compilato, ho ricevuto un errore che diceva che la proprietà SelectedItems era di sola lettura e non poteva essere impostata da XAML.

Sono collegato alla proprietà di controllo errata? C'è un modo per associare un ListBox a selezione multipla in XAML a una proprietà di raccolta del modello di vista? Grazie per l'aiuto.

risposta

6

Ho finito per utilizzare un po 'di code-behind in un gestore di eventi SelectionChanged per impostare la proprietà del modello di vista. Più semplice della creazione di wrapper di oggetti.

21

Che cosa si può fare per ovviare a questo:

Creare una proprietà IsSelected sulle voci che si sta visualizzando nella lista. Im supponendo che questi siano rappresentati anche da un modello di vista. Quindi non dovrebbe essere un dramma aggiungere una proprietà in più. Se sono solo oggetti di business considerare l'utilizzo di una classe wrapper per avvolgerli in modo indolore articoli vista modello (spudorato spina - here è un tale sistema lo uso tutti i giorni per avvolgere i miei oggetti di business.)

utilizzare uno stile elementi contenitore di legare la proprietà IsSelected dell'elemento casella di riepilogo alla proprietà IsSelected degli elementi che si sta visualizzando, in questo modo

<ListBox.ItemContainerStyle> 
     <!-- This Style binds a ListBoxItem to a the ViewModelItem. --> 
     <Style 
      TargetType="{x:Type ListBoxItem}"> 
      <Setter 
      Property="IsSelected" 
      Value="{Binding IsSelected, Mode=TwoWay}" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 

(potrebbe essere necessario un basata su attributo dello stile, non è sicuro)

Ora ogni volta che una lista la casella selezionata viene selezionata e il modello di visualizzazione ne sarà informato e può aggiornarne l'interno c ollection come richiesto.

+0

Mi auguro che tu abbia incluso il codice del viewmodel ... Non sono sicuro quali dati devono essere utilizzati sulla proprietà. – barrypicker

+0

La proprietà IsSelected è di tipo booleano. –

+0

È una soluzione molto bella. Nel caso in cui, per un DataGrid, il XAML è: Guillaume

0

Ho pubblicato una tecnica per consentire un binding di sola lettura alla proprietà SelectedItems di un WGrF DataGrid estendendo semplicemente il DataGrid che credo possa essere facilmente cooptato per un ListBox. Puoi vedere il mio post al numero https://stackoverflow.com/a/16953833/62278