WPF ListView SelectedItem является нулевым - PullRequest
12 голосов
/ 09 апреля 2010

У меня есть 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>

Ответы [ 3 ]

16 голосов
/ 09 апреля 2010

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

private void CheckBox_Click(object sender, RoutedEventArgs e) {
    var cb = sender as CheckBox;
    var item = cb.DataContext;
    myListView.SelectedItem = item;
}
3 голосов
/ 09 апреля 2010

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

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

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

и

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

0 голосов
/ 12 апреля 2010

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

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