2010-04-09 88 views
12

我有一個列表視圖有一個複選框作爲列之一。如果我點擊任何地方,但實際複選框ListView的SelectedItem設置爲當前選定的行,如預期。另一方面,如果我點擊複選框(不先點擊行),那麼SelectedItem爲空或先前單擊的行。WPF ListView SelectedItem爲空

誰能幫我....

乾杯

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

回答

16

這很容易,只需處理你的複選框,單擊事件:

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

+1確實很簡單。我應該拿一些眼鏡。我讀了你的答案,我以爲你誤解了這個問題。這是我錯誤理解你的答案。很簡單....謝謝:-) – ozczecho 2010-04-12 12:53:19

+0

+1 Kajillion。簡單,有效。愛它。 – Riddari 2010-08-20 19:24:59

+0

我一直在尋找小時,這正是我所期待的,我想!它完美的作品。非常感謝!的確很簡單。 – nitefrog 2011-02-09 08:49:26

3

你必須分析你的視覺樹來獲取被檢查複選框的指數和選擇特定的列表框項目的每當一些複選框被選中代碼

您還可能有興趣在

How to get checked items in a WPF ListBox?

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

+0

+1 ....對於遲到的回覆抱歉。是的,必須解析視覺樹,但不是在你的鏈接建議。儘管如此,謝謝你的回覆。看到我的答案。 – ozczecho 2010-04-12 12:32:58

0

德維爾建議解析可視樹得到的複選框。事情是我已經有了複選框。我需要的是擁有複選框的listviewitem。經過進一步研究,這blog post指出我在正確的方向。這裏是獲得點擊複選框的行的listviewitem的代碼:

 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

你** **嘗試** @ majocha的回答? – ANeves 2010-04-12 12:49:15

+0

...是的,在我輸入我的答案之後......噢......一個更好的解決方案。 – ozczecho 2010-04-12 12:55:28