WPF ListView的选中项为null

13

我有一个ListView,其中一个列是复选框。 如果我单击实际复选框以外的任何地方,则ListView的SelectedItem将设置为当前选定行,正如预期的那样。 另一方面,如果我直接点击复选框(而没有先点击行),则SelectedItem为null或之前单击的行。

有人能帮我解决这个问题吗?

谢谢。

<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>
3个回答

17

很简单,只需处理复选框的点击事件:

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

非常容易。我应该戴眼镜了。我读了你的答案,我以为你误解了问题。是我误解了你的答案。非常简单...谢谢 :-) - ozczecho
我已经搜索了几个小时,这正是我一直在寻找的!它完美地运行着。非常感谢你!真的很简单。 - nitefrog

3

+1……抱歉回复晚了。是的,我不得不解析可视树,但不是像你提供的链接建议的那样。尽管如此,还是感谢你的回复。请看我的答案。 - ozczecho

0

Veer建议解析可视树以获取复选框。问题是我已经有了复选框。我需要的是包含复选框的listviewitem。经过进一步研究,这篇博客文章指引我朝着正确的方向前进。以下是获取被单击复选框所在行的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());
        }
    }

你尝试了 @majocha 的答案吗? - ANeves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接