Как убрать нежелательную красную рамку вокруг (3 состояния) отмеченных элементов списка? - PullRequest
0 голосов
/ 11 мая 2018

Я создал ListBox, который имеет CheckBox из трех состояний для каждого элемента ListBox с настраиваемыми изображениями CheckBox для каждого состояния.Проблема в том, что, когда элементы установлены в это третье (null) состояние, вокруг элемента появляется нежелательная красная граница, и я не знаю, почему это появляется или как его удалить.

Вотстиль для ListBox:

<Style x:Key="ThreeStateCheckBoxListStyle" TargetType="{x:Type ListBox}">
    <Setter Property="SelectionMode" Value="Multiple"></Setter>
    <Setter Property="Margin" Value="8"></Setter>
    <Setter Property="Background" Value="Transparent"></Setter>
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Margin" Value="2" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                            <CheckBox Focusable="False" Foreground="{StaticResource textBrush}" 
                                      IsThreeState="True" IsChecked="{Binding Path=IsSelected, Mode=TwoWay,
                                        RelativeSource={RelativeSource TemplatedParent}}">
                                <CheckBox.Template>
                                    <ControlTemplate TargetType="{x:Type CheckBox}">
                                        <StackPanel Orientation="Horizontal">
                                            <Image x:Name="checkboxImage" Source="pack://application:,,,/Images/CheckBoxUncheck_16x.png" Width="16"
                                                   Margin="0,0,2,0" />
                                            <ContentPresenter/>
                                        </StackPanel>
                                        <ControlTemplate.Triggers>
                                            <Trigger Property="IsChecked" Value="True">
                                                <Setter TargetName="checkboxImage" Property="Source" Value="pack://application:,,,/Images/CheckBox_16x.png"/>
                                            </Trigger>
                                            <Trigger Property="IsChecked" Value="{x:Null}">
                                                <Setter TargetName="checkboxImage" Property="Source" Value="pack://application:,,,/Images/CheckBoxExclude_16x.png"/>
                                            </Trigger>
                                        </ControlTemplate.Triggers>
                                    </ControlTemplate>
                                </CheckBox.Template>
                                <ContentPresenter></ContentPresenter>
                            </CheckBox>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

1 Ответ

0 голосов
/ 11 мая 2018

Похоже на этот переплет

IsChecked="{Binding Path=IsSelected, 
                    Mode=TwoWay,
                    RelativeSource={RelativeSource TemplatedParent}}"

отвечает за наблюдаемый результат, потому что CheckBox.IsChecked может быть True | False | null (Nullable<bool>), когда ListBoxItem.IsSelected равно bool

если я установлю подробную информацию о трассировке, используя PresentationTraceSources.TraceLevel=High

IsChecked="{Binding Path=IsSelected, 
                    Mode=TwoWay,
                    PresentationTraceSources.TraceLevel=High,
                    RelativeSource={RelativeSource TemplatedParent}}"

Я получаю:

BindingExpression : GetValue at level 0 from ListBoxItem using DependencyProperty(IsSelected): 'False'
BindingExpression : TransferValue - got raw value 'False'
BindingExpression : TransferValue - using final value 'False'
BindingExpression : Update - got raw value 'True'
BindingExpression : Update - using final value 'True'
BindingExpression : SetValue at level 0 to ListBoxItem using DependencyProperty(IsSelected): 'True'
BindingExpression : GetValue at level 0 from ListBoxItem using DependencyProperty(IsSelected): 'True'
BindingExpression : TransferValue - got raw value 'True'
BindingExpression : TransferValue - using final value 'True'
BindingExpression : Update - got raw value <null>
BindingExpression : Update - using final value {DependencyProperty.UnsetValue}

null приводит к {DependencyProperty.UnsetValue}, и это ошибка для свойства boSl IsSelected

Красная рамка вокруг элемента по умолчанию Validation.ErrorTemplate. Вы можете отключить его на CheckBox

<CheckBox Validation.ErrorTemplate="{x:Null}" Focusable="False" ...

обратите внимание, что CheckBox в неопределенном состоянии (IsChecked = null) не очищает выбор ListBoxItem

...