使用SelectionMode = Extended选择列表框

时间:2012-07-31 16:32:17

标签: c# wpf listbox

对于模糊的标题感到抱歉,我无法想出总结正在发生的事情的好方法。

我有一个绑定的WPF列表框:

<UserControl.Resources>
    <DataTemplate DataType="{x:Type local:MyBoundObject}">
        <TextBlock Text="{Binding Label}" />
    </DataTemplate>
</UserControl.Resources>

<ListBox ItemsSource="{Binding SomeSource}" SelectionMode="Extended">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="IsSelected Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

我想只对所选项目进行操作。我这样做是通过迭代所有项目的列表并检查每个对象来查看它是否已设置IsSelected属性。

除了我在列表中有很多项目(足够,所以它们不是全部可见)之外,这是有效的,我按CTRL-A选择所有项目。当我这样做时,所有可见项的IsSelected属性都设置为true,其余所有项都保留为false。当我向下滚动时,其他项目进入视图,然后它们的IsSelected属性设置为true。

有没有办法解决这个问题,以便在按CTRL-A时将每个对象的IsSelected属性设置为true?

2 个答案:

答案 0 :(得分:5)

尝试设置

ScrollViewer.CanContentScroll="False"
在ListBox上,它应该修复ctrl +一个问题。

答案 1 :(得分:2)

如果要获取所有选定的项目,可以使用ListBox中的SelectedItems属性。您不需要将IsSelected属性添加到对象。

检查以下示例。

XAML文件:

                                        

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="30" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <StackPanel Orientation="Horizontal">
        <Button Content="Selected items" Click="Button_Click" />
        <Button Content="Num of IsSelected" Click="Button_Click_1" />
    </StackPanel>

    <ListBox Name="lbData" SelectionMode="Extended" Grid.Row="1">
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>
</Grid>

代码隐藏文件:

using System.Collections.Generic;
using System.Windows;
using System.Windows.Documents;

namespace ListBoxItems
{   
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<MyBoundObject> _source = new List<MyBoundObject>();
            for (int i = 0; i < 100000; i++)
            {
                _source.Add(new MyBoundObject { Label = "label " + i });
            }
            lbData.ItemsSource = _source;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(lbData.SelectedItems.Count.ToString());
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            int num = 0;
            foreach (MyBoundObject item in lbData.Items)
            {
                if (item.IsSelected) num++;
            }

            MessageBox.Show(num.ToString());
        }
    }

    public class MyBoundObject
    {
        public string Label { get; set; }
        public bool IsSelected { get; set; }
    }
}