WPF: более 1 элементов отображаются как выбранные в ListBox? - PullRequest
0 голосов
/ 14 ноября 2010

У меня есть ListBox с примененными пользовательскими стилями. Иногда кажется, что когда я выбираю цвет, а затем другой (не нажимал Ctrl / Shift), кажется, что выбраны 2 элемента, иногда даже больше

alt text

Что с этим рендерингом? Мой XAML выглядит как

<ListBox ItemsSource="{Binding ThemeColors}" SelectedValue="{Binding Color}" SelectionChanged="ListBox_SelectionChanged" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Margin="3" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Padding" Value="0" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                        <Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" Padding="1">
                            <Rectangle Width="20" Height="20">
                                <Rectangle.Fill>
                                    <SolidColorBrush Color="{Binding}" />
                                </Rectangle.Fill>
                            </Rectangle>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="true">
                                <Setter Property="BorderBrush" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                            </Trigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsSelected" Value="true"/>
                                    <Condition Property="Selector.IsSelectionActive" Value="false"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="BorderBrush" TargetName="Bd" Value="#FF999999"/>
                            </MultiTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

ОБНОВЛЕНИЕ: 14 ноября

Так что я последовал совету @Meleak и удалил все дубликаты, некоторые из них есть. Но теперь есть другая проблема. Иногда, когда я выбираю цвет, граница не отображается, стиль IsSelected не активен? Но предварительный просмотр цвета обновляется, показывая, что привязка сработала.

http://screenr.com/18c

1 Ответ

1 голос
/ 14 ноября 2010

Я думаю, что у вас точно такая же проблема, как и у Гишу в этом вопросе.По сути, Color является структурой, а не классом, и когда вы выбираете Color, который представлен более одного раза в ListBox, тогда Selection не удастся, так как он не может определить разницу между ними.Пример, равный становится правдой.

Color color1 = Colors.AliceBlue; //#FFF0F8FF
Color color2 = Color.FromArgb(255, 240, 248, 255); //#FFF0F8FF
bool equal = (color1 == color2);

Я могу придумать три решения вашей проблемы.

  1. Удалите дубликаты из ThemeColors
  2. Измените коллекцию на SolidColorBrush (которая является классом, а не структурой) и привязайте к цвету.
  3. Создайте свой собственный класс Color, например MyColor.
...