2010-04-09 9 views
12

Mam Listview, który ma pole wyboru jako jedną z kolumn. Jeśli klikam w dowolnym miejscu, ale w rzeczywistym polu wyboru, SelectedItem z ListView jest ustawiany zgodnie z oczekiwaniami do bieżącego wybranego wiersza. Jeśli, z drugiej strony, klikam na pole wyboru (bez klikania pierwszego wiersza), to SelectedItem ma wartość null lub poprzednio kliknięty wiersz.Plik WPF ListView SelectedItem ma wartość null

Czy ktoś może mi pomóc ....

Cheers

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

Odpowiedz

16

To bardzo proste, wystarczy obsłużyć zdarzenie Kliknij na checkbox:

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

+1 Rzeczywiście bardzo łatwe. Powinienem wziąć szklanki. Przeczytałem twoją odpowiedź i pomyślałem, że źle to zrozumiałeś. To ja źle zrozumiałem twoją odpowiedź. Bardzo proste .... Dzięki :-) – ozczecho

+0

+1 Kajillion. Proste, działa. Kocham to. – Riddari

+0

Szukałem wiele godzin i właśnie tego szukałem, myślę! Działa idealnie. Dziękuję bardzo! Rzeczywiście tak proste. – nitefrog

3

Musisz przeanalizować swoje wizualne drzewa, aby uzyskać indeks wyboru, który jest sprawdzony i wybrać ten konkretny element listbox w swojej Kod gdy jest zaznaczone pole wyboru kilka

Możesz być także zainteresowany

How to get checked items in a WPF ListBox?

i

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

+0

+1 .... przepraszam za spóźnioną odpowiedź. Tak, musiałem parsować wizualne drzewo, ale nie w sposób sugerowany przez twoje linki. Mimo to, dziękuję za odpowiedź. Zobacz moją odpowiedź. – ozczecho

0

Veer zasugerował parsowania wizualne drzewa, aby uzyskać pole. Rzeczy jest już miałem pole wyboru. Potrzebowałem listviewviewem, który posiadał pole wyboru. Po dalszych badaniach ten blog post wskazał mi w dobrym kierunku. Oto kod, aby uzyskać listviewitem wiersza, w którym zostało zaznaczone pole wyboru:

 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

Czy ** spróbowałeś odpowiedzi ** @ majocha? – ANeves

+0

... tak, po tym jak wpisałem moją odpowiedź ... D'oh .... o wiele lepsze rozwiązanie. – ozczecho