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を適切なTriggers内部で直接設定ControlTemplate することですGrid

コードは次のようになります。

<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 に答える