将验证纳入样式

发布于 2024-12-08 16:48:37 字数 1556 浏览 0 评论 0原文

我在视图模型上使用 IDataErrorInfo,并且我有一个带有错误模板的 TextBox 样式(如下),可以正常工作。我知道“ValidatesOnDataErrors=True”的用法如下:

<TextBox Text="{Binding Path=LastName, ValidatesOnDataErrors=True}" 
                    Style="{StaticResource TextBoxStyle}" />

将强制WPF使用IDataErrorInfo,但我想知道如何将其融入我的风格中。

干杯,
贝里尔

<Style x:Key="TextBoxStyle" TargetType="{x:Type TextBox}">
    ...

    <!--
    Error handling
    -->
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel LastChildFill="True">
                    <TextBlock DockPanel.Dock="Right" Text=" *" 
                               Foreground="Red" 
                               FontWeight="Bold" FontSize="16" 
                               ToolTip="{Binding ElementName=placeholder, Path=AdornedElement.(Validation.Errors).CurrentItem.ErrorContent}"/>
                    <Border BorderBrush="Red"  BorderThickness="1">
                        <AdornedElementPlaceholder Name="placeholder"></AdornedElementPlaceholder>
                    </Border>
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="True">
            <Setter Property="Background" Value="LightYellow"/>
        </Trigger>
    </Style.Triggers>
</Style>

I use IDataErrorInfo on my viewmodels and I have a style (below) for a TextBox with an error template that works ok. I know that "ValidatesOnDataErrors=True" used like:

<TextBox Text="{Binding Path=LastName, ValidatesOnDataErrors=True}" 
                    Style="{StaticResource TextBoxStyle}" />

will force WPF to use IDataErrorInfo but am wondering how to get that baked into my style.

Cheers,
Berryl

<Style x:Key="TextBoxStyle" TargetType="{x:Type TextBox}">
    ...

    <!--
    Error handling
    -->
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel LastChildFill="True">
                    <TextBlock DockPanel.Dock="Right" Text=" *" 
                               Foreground="Red" 
                               FontWeight="Bold" FontSize="16" 
                               ToolTip="{Binding ElementName=placeholder, Path=AdornedElement.(Validation.Errors).CurrentItem.ErrorContent}"/>
                    <Border BorderBrush="Red"  BorderThickness="1">
                        <AdornedElementPlaceholder Name="placeholder"></AdornedElementPlaceholder>
                    </Border>
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="True">
            <Setter Property="Background" Value="LightYellow"/>
        </Trigger>
    </Style.Triggers>
</Style>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

爱,才寂寞 2024-12-15 16:48:37

如果我理解您的要求,您希望能够在您的样式中使用 ValidatesOnDataError=True ,这样您就不必每次都重复它。

如果是这种情况,则不能,因为这是数据绑定的属性,而不是样式的属性;并且您无法模板化数据绑定。

If I understand what you're asking, you want to be able to be able to use the ValidatesOnDataError=True in your style, that so you don't have to repeat it every time.

If that's the case you can't, because that is a property of the data binding and not the style; and you can't template the data binding.

谁许谁一生繁华 2024-12-15 16:48:37

我只是想知道你是否使用标签而不是文本框,那么在标签的样式中你可能可以做这样的事情,

                <ControlTemplate TargetType="sdk:Label">
                    <TextBlock x:Name="textBlock" Text="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, ValidatesOnDataErrors=True}">

I just wonder if you use a Label instead of a TextBox, then in the style of the Label you can probably do something like this,

                <ControlTemplate TargetType="sdk:Label">
                    <TextBlock x:Name="textBlock" Text="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, ValidatesOnDataErrors=True}">
缱倦旧时光 2024-12-15 16:48:37

你不能,因为这是与你的属性绑定的定义的一部分,而不是错误的可视化方式。

You can't because that is part of the definition of the binding to your property, not how the error is visualized.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文