Подтвердить что ты не робот

WPF ListView SelectedItem имеет значение null

У меня есть Listview, который имеет флажок в качестве одного из столбцов. Если я щелкнул где-нибудь, но фактический флажок, SelectedItem из ListView будет выбран в текущую выбранную строку, как и ожидалось. Если, с другой стороны, я нажимаю на флажок (не нажимая сначала на строку), тогда 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>
4b9b3361

Ответ 1

Это очень просто, просто обработайте событие Click на вашем флажке:

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

Ответ 2

Вы должны проанализировать свое визуальное дерево, чтобы получить индекс установленного флажка, и выберите этот конкретный элемент списка в своем коде всякий раз, когда отмечен какой-либо флажок.

Вы также можете быть заинтересованы в

Как получить отмеченные элементы в ListBox WPF?

и

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

Ответ 3

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());
        }
    }