Silverlight 4: проблема выбора ListBoxItem - PullRequest
0 голосов
/ 21 апреля 2011

Мне нужно программно выбрать подмножество ListBoxItems в элементе управления ListBox ( SelectedMode = Multiple ).

<Grid x:Name="LayoutRoot" Background="White">
    <ListBox Height="238" HorizontalAlignment="Left" Margin="26,41,0,0" Name="listBox1" VerticalAlignment="Top" Width="349" SelectionMode="Multiple" />
    <Button Content="Fill" Height="23" HorizontalAlignment="Left" Margin="26,12,0,0" Name="buttonFill" VerticalAlignment="Top" Width="75" Click="buttonFill_Click" />
    <Button Content="Randomly Select" Height="23" HorizontalAlignment="Left" Margin="116,12,0,0" Name="buttonSelectRandom" VerticalAlignment="Top" Width="104" Click="buttonSelectRandoml_Click" />
</Grid>


    private void buttonFill_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i < 100; i++)
            listBox1.Items.Add(new ListBoxItem { Content = i.ToString()});
    }

    private void buttonSelectRandom_Click(object sender, RoutedEventArgs e)
    {
        var rand = new Random();

        foreach (ListBoxItem item in listBox1.Items)
            if (rand.Next(2)==1) item.IsSelected = true; 
    }

Однако, кажется, что только видимые в данный момент элементы показывают как выбранное, когда я запускаю код (нажмите кнопку «Заполнить», а затем кнопку «Произвольный выбор»). Прокрутка ListBox показывает других выбранных ListBoxItems как выбранных, даже если проверка их состояния «IsSelected» в коде покажет, что они установлены в «true».

Интересно, что если я сначала вручную прокручиваю до конца ListBox (или частично), а затем нажимаю кнопку «Произвольный выбор», то ListBox будет правильно рисовать все выбранные элементы. Я пробовал много обходных путей, но не могу найти тот, который работает. Это ошибка? Есть обходные пути?

Спасибо за вашу помощь.

увертываться

1 Ответ

3 голосов
/ 21 апреля 2011

это может быть потому, что ListBox использует VirtualizingStackPanel.Можете ли вы проверить его с помощью обычной StackPanel?

    <ListBox>
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
    </ListBox>

Редактировать:

Другое решение - вместо выполнения item.IsSelected = true, вы делаете

        foreach (int item in listBox1.Items)
        {
            if (rand.Next(2) == 1)
            {
                this.listBox1.SelectedItems.Add(item);
            }
        }

Я проверил это, и оно работает.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...