2010-04-09 9 views
12

Tôi có một Listview có một hộp kiểm như một trong các cột. Nếu tôi nhấp vào bất kỳ đâu nhưng hộp kiểm thực tế, SelectedItem của ListView được đặt thành hàng đã chọn hiện tại, như mong đợi. Nếu, mặt khác tôi nhấp vào hộp kiểm (mà không cần nhấp vào hàng đầu tiên) sau đó SelectedItem là null hoặc hàng được nhấp trước đó.WPF ListView SelectedItem là null

bất cứ ai có thể giúp tôi ra ....

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> 

Trả lời

16

Nó rất dễ dàng, chỉ cần xử lý Bấm vào sự kiện trên hộp kiểm của bạn:

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

+1 Rất dễ thực sự. Tôi nên đeo kính. Tôi đọc câu trả lời của bạn và tôi nghĩ bạn đã hiểu nhầm câu hỏi. Chính tôi là người hiểu sai câu trả lời của bạn. Rất đơn giản .... Cảm ơn :-) – ozczecho

+0

+1 Kajillion. Đơn giản, công trình. Yêu nó. – Riddari

+0

Tôi đã tìm kiếm hàng giờ và đây chính xác là những gì tôi đang tìm kiếm Tôi nghĩ! Nó hoạt động hoàn hảo. Cảm ơn bạn rất nhiều! Thật đơn giản. – nitefrog

3

Bạn cần phải phân tích cây thị giác của bạn để có được những chỉ số của hộp kiểm đó được kiểm tra và chọn mục đó listbox đặc biệt trong bạn mã bất cứ khi một số hộp kiểm được kiểm tra

Bạn cũng có thể quan tâm đến

How to get checked items in a WPF ListBox?

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

+0

+1 .... xin lỗi vì trả lời muộn. Có, đã phải phân tích cú pháp cây thị giác, nhưng không phải theo gợi ý của các liên kết của bạn. Tuy nhiên, cảm ơn bạn đã trả lời. Xem câu trả lời của tôi. – ozczecho

0

Veer gợi ý phân tích các cây thị giác để có được hộp kiểm. Mọi thứ là tôi đã có hộp kiểm. Những gì tôi cần là listviewitem đã tổ chức hộp kiểm. Sau khi nghiên cứu thêm, điều này blog post chỉ cho tôi đi đúng hướng. Đây là mã để có được listviewitem của hàng mà hộp kiểm đã được nhấp:

 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

Bạn đã thử ** @ câu trả lời của majocha chưa? – ANeves

+0

... vâng, sau khi tôi gõ câu trả lời của tôi ... D'oh .... một giải pháp tốt hơn nhiều. – ozczecho