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 に答える