Извлекать выбранные элементы из отмеченного списка?
Я реализовал 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>