2010-04-09 25 views
12

Tengo una vista de lista que tiene una casilla de verificación como una de las columnas. Si hago clic en cualquier lugar que no sea la casilla de verificación real, el elemento seleccionado de ListView se establece en la fila seleccionada actual, como se esperaba. Si, por otro lado, hago clic en la casilla de verificación (sin hacer clic primero en la fila), entonces el elemento seleccionado es nulo o la fila en la que se hizo clic anteriormente.WPF ListView SelectedItem es nulo

Puede alguien ayudarme ....

Saludos

<ListView Width="auto" SelectionMode="Single" x:Name="listBox" ItemsSource="{Binding MyData}" SelectedItem="{Binding Path=SelectedMyData}"> 
         <ListView.View> 
          <GridView> 
           <GridViewColumn Header="Date" Width="120"> 
            <GridViewColumn.CellTemplate> 
             <DataTemplate> 
              <ContentPresenter Style="{StaticResource DateTimeContent}" Content="{Binding MyDate}"/> 
             </DataTemplate> 
            </GridViewColumn.CellTemplate> 
           </GridViewColumn> 
           <GridViewColumn Header="Is Correct" Width="100"> 
            <GridViewColumn.CellTemplate> 
             <DataTemplate> 
              <CheckBox IsThreeState="False" 
                 Checked="OnChkChecked" 
                 Unchecked="OnChkChecked" 
                 IsChecked="{Binding IsCorrect}"></CheckBox> 
             </DataTemplate> 
            </GridViewColumn.CellTemplate> 
           </GridViewColumn> 
          </GridView> 
         </ListView.View> 
        </ListView> 




            <GridViewColumn.CellTemplate> 
             <DataTemplate> 
              <CheckBox IsThreeState="False" 
                 Checked="OnChkChecked" 
                 Unchecked="OnChkChecked" 
                 IsChecked="{Binding IsCorrect}"></CheckBox> 
             </DataTemplate> 
            </GridViewColumn.CellTemplate> 
           </GridViewColumn> 
          </GridView> 
         </ListView.View> 
        </ListView> 

Respuesta

16

Es muy fácil, sólo manejan Haga clic en su caso casilla:

private void CheckBox_Click(object sender, RoutedEventArgs e) { 
    var cb = sender as CheckBox; 
    var item = cb.DataContext; 
    myListView.SelectedItem = item; 
} 
+0

+1 Muy fácil de hecho. Debería comprarme unas gafas Leí tu respuesta y pensé que no entendiste la pregunta. Fui yo quien malinterpreté tu respuesta. Muy simple ... Gracias :-) – ozczecho

+0

+1 Kajillion. Simple, funciona Quiéralo. – Riddari

+0

¡He estado buscando por horas y esto es exactamente lo que estaba buscando, creo! Funciona perfectamente Muchas gracias! Tan simple de hecho. – nitefrog

3

Hay que analizar su árbol visual para obtener el índice de la casilla de verificación que se comprueba y seleccionar ese elemento cuadro de lista en particular en su código cada vez que se comprueba alguna casilla

también puede estar interesado en

How to get checked items in a WPF ListBox?

y

http://goalbook.wordpress.com/2009/09/05/wpf-checkedlist-control/

+0

+1 ... perdón por la respuesta tardía. Sí, tuvo que analizar el árbol visual, pero no en el sugerido por sus enlaces. No obstante, gracias por la respuesta. Ver mi respuesta – ozczecho

0

Veer sugirió analizar el árbol visual para conseguir la casilla de verificación. Las cosas es que ya tenía la casilla de verificación. Lo que necesitaba era el elemento de lista que contenía la casilla de verificación. Después de más investigaciones, este blog post me indicó la dirección correcta. Aquí está el código para obtener el listviewitem de la fila en la que se hizo clic en la casilla de verificación:

 private void chkbox_Checked(object sender, RoutedEventArgs e) 
    { 
     DependencyObject dep = e.OriginalSource as DependencyObject; 
     while ((dep != null) && !(dep is ListViewItem)) 
     { 
      dep = VisualTreeHelper.GetParent(dep); 
     } 

     if (dep != null) 
     { 
      IMyViewModel vm = DataContext as IMyViewModel; 
      vm.SelectedThing = (MyListItemViewModel)lst.ItemContainerGenerator.ItemFromContainer(dep); 
      vm.DoSomethingCommand.Execute(e.RoutedEvent.Name.ToLower()); 
     } 
    } 
+0

¿Has probado ** la respuesta de ** @ majocha? – ANeves

+0

... sí, después de que escribí mi respuesta ... D'oh ... una solución mucho mejor. – ozczecho