从已检查列表框中检索所选项目?

时间:2015-06-24 00:52:19

标签: c# wpf xaml checkboxlist checkedlistbox

我已经实现了一个Checked List Box(或者更确切地说,试图实现一个选中的列表框),它已经很好了。我已经能够使用目录中的文件列表填充它(这是我需要的),但是当我选择项目,然后尝试检查.SelectedItems属性时,列表中没有任何内容。 / p>

这是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 个答案:

答案 0 :(得分:2)

您的DataTemplate错误。您创建另一个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>