从选中的列表框中检索选定的项目?

Retrieving Selected Items from Checked List Box?

我已经实现了一个选中的列表框(或者更确切地说,尝试实现一个选中的列表框),并且进展顺利。我已经能够用目录中的文件列表填充它(这是我需要的),但是当我 select 项目时,然后尝试检查 .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" ) );

显然我在这里做错了,我到处都看到关于如何创建这些东西的帖子,但我无法弄清楚如何让它对实际 selecting 项目起作用。

请告诉我我做错了什么。

您的数据模板有误。您创建了另一个 ListBoxItem,因此简化的可视化树看起来像这样:

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

只需从 DataTemplate 中删除 ListBoxItem 并在 CheckBox 中设置 Binding,在其中找到正确的 ListBoxItem

<DataTemplate>
    <CheckBox Content="{Binding Name}"
        IsChecked="{Binding 
            RelativeSource={RelativeSource 
                Mode=FindAncestor, 
                AncestorType={x:Type ListBoxItem}},
            Path=IsSelected,
            Mode=TwoWay}"
    Tag="{Binding FullName}" />
</DataTemplate>