4

抱歉标题含糊不清,我想不出一个好方法来总结正在发生的事情。

我有一个绑定的 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?

4

2 回答 2

5

尝试设置

ScrollViewer.CanContentScroll="False"

在 ListBox 上,它应该修复 ctrl+a 问题。

于 2012-08-20T09:53:05.803 回答
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; }
    }
}
于 2012-07-31T20:21:24.207 回答