0

WPF /MVVM 模式

使用验证属性具有多个文本框的用户控件。在以下样式中,一切都按预期工作-除了那些有验证错误的人,由于控制模板中用于设置错误图像的方法,没有设置聚焦背景色。

如果我删除控制模板,如果设置了验证错误,则在聚焦时背景色设置正确。使用模板,背景色始终为白色/默认。

关于 XAML 的任何建议都需要 - 聚焦时不同的背景色和验证失败时的错误图像?

<Style TargetType="{x:Type TextBox}">
    <Setter Property="Margin" Value="1" />
    <Setter Property="ToolTip" Value="{Binding Description}"/>

    <Style.Triggers>
        <Trigger Property="IsFocused" Value="True">
            <Setter Property="Background" Value="LightYellow"/>
        </Trigger>

        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip"
                    Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>

            <!--adds the error image and border, but also prevents background color change OnFocus-->
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Grid>
                            <Border  
                                    BorderBrush="#d99" x:Name="textBorder" CornerRadius="4" 
                                    BorderThickness="2" >
                                <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                            </Border>
                            <Image Name="ErrorImage" Width="24" Height="24" Margin="0,0,4,0"
                                    Source="/Images/error.png" HorizontalAlignment="Right">
                            </Image>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>
4

1 回答 1

0

您应该检查DependencyProperty 优先规则

这里发生的是ControlTemplate您定义的内容覆盖了Style.Triggers之前定义的内容。

您可以做的是直接在内部设置Style适当的实际值, 否则,如您所见,WPF 将只使用.TriggersControlTemplateGrid

代码应如下所示:

<Style.Triggers>

    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>

        <!--adds the error image and border, but also prevents background color change OnFocus-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                    <Grid.Style>
                      <Style TargetType="{x:Type Grid}">
                        <Style.Triggers>
    <!-- The trigger about IsFocused should be here!
    <Trigger Property="IsFocused" Value="True">
        <Setter Property="Background" Value="LightYellow"/>
    </Trigger>
                        </Style.Triggers>
                      </Style>
                    </Grid.Style>
                        <Border  
                                BorderBrush="#d99" x:Name="textBorder" CornerRadius="4" 
                                BorderThickness="2" >
                            <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                        </Border>
                        <Image Name="ErrorImage" Width="24" Height="24" Margin="0,0,4,0"
                                Source="/Images/error.png" HorizontalAlignment="Right">
                        </Image>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Trigger>
</Style.Triggers>

于 2012-05-21T20:49:59.707 回答