2010-02-17 14 views
11

Sto cercando un modo per selezionare più elementi nella visualizzazione elenco e cancellarli in una determinata azione. Quello che non riesco a capire è, come devo avere questi elementi multipli selezionati? Penserei che ci sia una lista in cui avrei bisogno di aggiungerli tutti, ma qual è il modo migliore per affrontare questa situazione, hai qualche idea? Grazie! -KevinWPF ListView Selezione di più oggetti Visualizza elenco

risposta

21

Set SelectionMode-Multiple o Extended e scorrere l'SelectedItems nel vostro ListView.

+1

Vale la pena notare che 'SelectionMode.Multiple' non include la possibilità di usare Maiusc + Fare clic per selezionare elementi consecutivi o Ctrl + A per selezionare tutto.Sembra un bug/supervisione. – Livven

+0

Collegamento interrotto - SelectedItems. –

+0

corretto! Grazie!! – Arcturus

4

Si può fare in uno dei seguenti ...

ListView.SelectionMode = SelectionMode.Extended nel code-behind o

<ListView SelectionMode="Extended"></ListView> in XAML

hai anche SelectionMode 'multipla' ancora si potrebbe invece andare per ' esteso 'che consente all'utente di selezionare più oggetti usando solo il modificatore di turno.

Per cancellare gli elementi selezionati è possibile utilizzare il ListView.SelectedItems Propery come segue

while(myListView.SelectedItems.Count > 0) 
{ 
    myListView.Items.Remove(list.SelectedItems[0]); 
} 

[o si potrebbe utilizzare la proprietà selectedIndices]

Spero che questo eviterà il problema che hai incontrato :)

Cheers!

8

Vorrei suggerire di non utilizzare la proprietà SelectedItems di ListView, invece associare la proprietà Selected del singolo ListViewItem, ad un corrispondente ViewModel di classe. Dopo questo, l'unica cosa che devi fare è trovare tutti gli oggetti ViewModel che hanno associato la proprietà Selected TRUE, rimuoverli dalla raccolta del modello (se rimuovi) e aggiornare l'interfaccia utente. Se la raccolta è ObservableCollection, l'interfaccia utente verrà aggiornata automaticamente. Buona fortuna.

+2

Potresti fornire qualche ragione per cui non dovresti usare la proprietà 'SelectedItems'? –

+1

perché rende il design più complicato e può portare a bug. Se hai una Proprietà Selezionata su ogni oggetto che si trova in ItemsSource, puoi associare ogni elemento molto facilmente in questo modo:

+0

@NomanKhan Dovrebbe essere ListViewItem non ListBoxItem; anche senza bisogno di BasedOn penso ... Ma buon commento, mi ha aiutato! –

0

ottenere il successo anche WPF ListView scrivendo

while (lvJournalDetails.SelectedItems.Count > 0) 
{ 
    lvJournalDetails.Items.Remove(lvJournalDetails.SelectedItem); 
} 
1

Arcturus risposta è buona, se non si sta usando MVVM. Ma se lo fai e il tuo ItemsSource è vincolato ad alcuni ObservableCollection di oggetti nel tuo ViewModel, vorrei raccomandare la risposta Tigran, con chiarimenti Noman Khan.

Ecco come sarebbe simile:

<ListView ItemsSource="{Binding SomeListViewList}"> 
    <ListView.Resources> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <Setter Property="IsSelected" Value="{Binding SomeItemSelected, Mode=TwoWay}" /> 
     </Style> 
    </ListView.Resources> 
    ... 
</ListView> 

In vista del modello si avrebbe oggetto: public ObservableCollection<SomeItem> SomeListViewList{ get; set; }

SomeItem classe dovrebbe includere una proprietà Selected:

public class SomeItem 
{ 
    public string SomeItemName { get; set; } 

    public string SomeItemNum { get; set; } 

    public bool SomeItemSelected { get; set; } 
} 

Poi si potrebbe scorrere/scorrere l'elenco e ottenere quelli che sono selezionati:

foreach (var item in SomeListViewList) 
    if (item.SomeItemSelected) 
     // do something