2011-04-09 20 views
9

Tengo un este código: se seleccionaWPF ListViewItem elemento casilla

<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

¿Cómo sé cuántos casilla de verificación está seleccionada, y consigo la etiqueta de valor de cada casilla de verificación?

+0

¿Puede ser más elaborado de lo que quiere lograr exactamente? –

+0

Uso casilla de verificación para eliminar Filas está seleccionada, pero no puedo obtener la etiqueta de valor de casilla de verificación está seleccionada. –

+1

la colección de objetos que ha vinculado al ListView tiene un ID de propiedad que ha vinculado con la propiedad Tag de Checkbox. En su lugar, tenga una propiedad booleana en ese objeto y vincúlela con la propiedad IsChecked de Checkbox. Luego, simplemente puede iterar su colección en su modelo de vista y ver qué elementos seleccionó el usuario. Otras cosas que deberá tener en cuenta: 1. Haga que su objeto implemente INotifyPropertyChanged. 2. Utilice un enlace bidireccional para Checkbox. Háganos saber si necesita algún código de muestra. – publicgk

Respuesta

5

Debe ser tan simple como vincular la propiedad IsChecked del CheckBox a una propiedad en el modelo de vista (puede que necesite agregar una nueva propiedad si no existe). Luego, una vez que se hace clic en el botón, simplemente iterará sobre todos los elementos de la colección y eliminará los que están marcados (en función del valor de la propiedad en el modelo de vista).

8

Sé que es antiguo, pero para la posteridad si la gente rastrojos sobre esto aquí está la solución

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

continuación en el código del archivo cs esto en el 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 debe ser el mismo tipo que su objeto vinculado a la lista. y el código simplemente agregará y eliminará la referencia a los elementos de la lista original a esa lista.

Ahora todo lo que tendrá que hacer es recorrer esa lista que contendrá solo los elementos realmente seleccionados. esto funciona solo para selección única, excepto que el lstMyObject solo contendrá 1 registro todo el tiempo.

Cuestiones relacionadas