Извлекать выбранные элементы из отмеченного списка?

Я реализовал Checked List Box (или, точнее, пытался реализовать Checked List Box), и все прошло довольно хорошо. Я смог заполнить его списком файлов из каталога (для чего он мне нужен), но когда я выбираю элементы, а затем пытаюсь проверить свойство.SelectedItems, в списке ничего нет.

Это XAML:

<ListBox x:Name="lbxSourceFiles" x:FieldModifier="private" SelectionMode="Multiple" Grid.Column="1" Grid.Row="2">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ListBoxItem IsSelected="{Binding IsChecked}">
                <CheckBox Content="{Binding Name}" Tag="{Binding FullName
            </ListBoxItem>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Вот как я это заполняю:

DirectoryInfo DI = new DirectoryInfo("Trivia Source Files");
this.lbxSourceFiles.ItemsSource = new ObservableCollection<FileInfo>( DI.GetFiles( "*.xls" ) );

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

Пожалуйста, скажите мне, что я делаю не так здесь.

1 ответ

Решение

Ваш шаблон данных неверен. Вы создаете еще один ListBoxItem, поэтому упрощенное визуальное дерево выглядит примерно так:

+- ListBox
|  +- ListBoxItem
|  |  +- ListBoxItem
|  |     +- CheckBox
|  +- ListBoxItem
|  |  +- ListBoxItem
|  |     +- CheckBox
|  +- ListBoxItem
|  |  +- ListBoxItem
|  |     +- CheckBox

Просто удалите ListBoxItem из DataTemplate и установите Binding в CheckBox, где вы найдете правильный ListBoxItem

<DataTemplate>
    <CheckBox Content="{Binding Name}"
        IsChecked="{Binding 
            RelativeSource={RelativeSource 
                Mode=FindAncestor, 
                AncestorType={x:Type ListBoxItem}},
            Path=IsSelected,
            Mode=TwoWay}"
    Tag="{Binding FullName}" />
</DataTemplate>
Другие вопросы по тегам