WPF:在ListBox中呈现的选项超过1项?

时间:2010-11-14 02:03:34

标签: wpf templates listbox styles

我有一个应用自定义样式的ListBox。有时候,当我选择一种颜色然后另一种颜色(没有按Ctrl / Shift)时,似乎选择了两个项目,有时甚至更多

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>

更新:11月14日

所以我跟着@Meleak建议并删除所有重复项,碰巧有一些。但现在有另一个问题。有时,当我选择颜色时,边框不显示,IsSelected样式不活动?但预览颜色更新,表明绑定工作。

http://screenr.com/18c

1 个答案:

答案 0 :(得分:1)

我认为你在this问题中遇到了与Gishu完全相同的问题。基本上,Color是一个结构而不是一个类,当你选择一个在ListBox中多次表示的Color时,Selection将失败,因为它无法分辨两者之间的区别。例如,等于成为现实。

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

我可以为您的问题考虑三种解决方案。

  1. 从ThemeColors中删除重复项
  2. 将Collection更改为SolidColorBrush(它是Class而不是Struct)并绑定到Color。
  3. 创建自己的Color类,例如MyColor。