2011-04-09 16 views
9

Ho un questo codice: è selezionataWPF ListViewItem voce casella

<ListView Height="238" 
       HorizontalAlignment="Left" 
       Name="listView1" 
       VerticalAlignment="Top" 
       Width="503" 
       ItemsSource="{Binding}" 
       IsSynchronizedWithCurrentItem="True"> 
     <ListView.View> 
      <GridView> 
       <GridView.Columns> 
        <GridViewColumn> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <CheckBox Tag="{Binding ID}"/> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
        <GridViewColumn DisplayMemberBinding="{Binding ID}" Header="ID" /> 
        <GridViewColumn DisplayMemberBinding="{Binding Name}" Header="Name" /> 
       </GridView.Columns> 
      </GridView> 
     </ListView.View> 
    </ListView> 

enter image description here

Come faccio a sapere quanti casella è selezionata, e ottenere il tag valore di ogni casella di controllo?

+0

Puoi essere più gentile di quello che vuoi raggiungere? –

+0

Uso la casella di controllo per eliminare Righe è selezionato, ma non posso ottenere il tag di valore della casella di controllo è selezionato. –

+1

la raccolta di oggetti che sono stati associati a ListView presenta un ID proprietà associato alla proprietà Tag della casella di controllo. Invece, avere una proprietà booleana in quell'oggetto e collegarla con la proprietà IsChecked di Checkbox. Quindi puoi semplicemente iterare la tua collezione nel tuo viewmodel e vedere quali elementi sono stati selezionati dall'utente. Ulteriori cose di cui avrai bisogno di fare attenzione: 1. Fai in modo che l'oggetto implementi INotifyPropertyChanged. 2. Utilizzare l'associazione bidirezionale per la casella di controllo. Facci sapere se hai bisogno di un codice di esempio. – publicgk

risposta

5

Dovrebbe essere semplice come legare la proprietà IsChecked di CheckBox a una proprietà sul ViewModel (potrebbe essere necessario aggiungere una nuova proprietà se non esiste già). Quindi, una volta che si fa clic sul pulsante, si esegue semplicemente un'iterazione su tutti gli elementi della raccolta e si eliminano quelli selezionati (in base al valore della proprietà sul ViewModel).

8

Lo so che è vecchio, ma per i posteri, se la gente stoppie su questo ecco la soluzione

<ListView Height="238" 
       HorizontalAlignment="Left" 
       Name="listView1" 
       VerticalAlignment="Top" 
       Width="503" 
       ItemsSource="{Binding}" 
       IsSynchronizedWithCurrentItem="True" 
       SelectionChanged="listView1_SelectionChanged"> 
     <ListView.View> 
      <GridView> 
       <GridView.Columns> 
        <GridViewColumn> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <CheckBox Tag="{Binding ID}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}" /> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
        <GridViewColumn DisplayMemberBinding="{Binding ID}" Header="ID" /> 
        <GridViewColumn DisplayMemberBinding="{Binding Name}" Header="Name" /> 
       </GridView.Columns> 
      </GridView> 
     </ListView.View> 
    </ListView> 

poi nel codice del file cs questo nel listView1_SelectionChanged

private List<MyObject> lstMyObject = new List<MyObject>(); 

private void listView1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    foreach (MyObject item in e.RemovedItems) 
    { 
     lstMyObject.Remove(item); 
    } 

    foreach (MyObject item in e.AddedItems) 
    { 
     lstMyObject.Add(item); 
    } 
} 

lstMyObject dovrebbe essere stesso tipo di tua oggetto legato alla lista. e il codice aggiungerà e rimuoverà semplicemente i riferimenti agli elementi della lista originale a quella lista.

Ora tutto ciò che dovrete fare è scorrere l'elenco che conterrà solo gli elementi effettivamente selezionati. questo funziona solo per selezione singola, tranne per il fatto che lstMyObject conterrà solo 1 record per tutto il tempo.

Problemi correlati