2010-04-09 59 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