Wpf文本框验证控件模板触发文本值

Posted

技术标签:

【中文标题】Wpf文本框验证控件模板触发文本值【英文标题】:Wpf textbox validation controltemplate trigger on text value 【发布时间】:2019-02-28 07:55:00 【问题描述】:

我有一个文本框:

<TextBox Grid.Row="3"
         Grid.Column="1"
         Width="200"
         TextWrapping="Wrap"
         VerticalAlignment="Top"
         Margin="5,10,-10,2"
         Style="StaticResource TextBoxValueStyle"
         Validation.ErrorTemplate="StaticResource ValidationControlTemplate">                        
                    <TextBox.Text>
                        <MultiBinding StringFormat=" 0 1">
                            <Binding Path="Id" ValidatesOnNotifyDataErrors="True" NotifyOnValidationError="True"/>
                            <Binding Path="Name"  />
                        </MultiBinding>
                    </TextBox.Text>
</TextBox>

这是我的控制模板:

<ControlTemplate x:Key="ValidationControlTemplate">
    <DockPanel Visibility="Binding ElementName=Placeholder, Path=Visibility">

        <Image x:Name="Image"
               DockPanel.Dock="Right"
               VerticalAlignment="Center"
               Margin="0,-2"
               Style="StaticResource InformationImageStyle">
            <Image.ToolTip>
                <ItemsControl ItemsSource="Binding">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="Binding ErrorContent"/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </Image.ToolTip>

        </Image>
        <AdornedElementPlaceholder Name="Placeholder" VerticalAlignment="Center"/>
    </DockPanel>
    <ControlTemplate.Triggers>
        <Trigger Property="TextBox.Text" Value="">
            <Setter Property="DockPanel.Dock" TargetName="Image" Value="Left"/>
            <Setter Property="Margin" TargetName="Image" Value="-20,-2"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

我的问题是,当文本框有一个值(并且有错误)时,它没有采用原始值(DockPanel.Dock=Right and Margin=0,-2)

我总是从空文本开始。图像总是显示在左边,错误。

我错过了什么?

【问题讨论】:

我不明白你的问题。 Validation.ErrorTemplate 只会在实际出现错误时显示。当没有验证错误时,没有DockPanel @mm8 如果文本框中有文本仍然可能是错误,然后我希望图像显示在右侧,而不是左侧。 所以你的问题是图像(总是)显示在左侧? @mm8 是的,这就是我无法解决的问题 =( @mm8 出现错误时总是在左侧,没有错误时我看不到图片(应该是这样) 【参考方案1】:

&lt;AdornedElementPlaceholder /&gt; 元素周围放置一个Grid,并将Trigger 替换为绑定到装饰的TextBox 元素的DataTrigger

<ControlTemplate x:Key="ValidationControlTemplate">
    <DockPanel Visibility="Binding ElementName=Placeholder, Path=Visibility">
        <Image x:Name="Image"
                       DockPanel.Dock="Right"
                       VerticalAlignment="Center"
                       Margin="0,-2"
                       Style="StaticResource InformationImageStyle">
            <Image.ToolTip>
                <ItemsControl ItemsSource="Binding">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="Binding ErrorContent"/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </Image.ToolTip>
        </Image>
        <Grid>
            <AdornedElementPlaceholder Name="Placeholder" VerticalAlignment="Center"/>
        </Grid>
    </DockPanel>
    <ControlTemplate.Triggers>
        <DataTrigger Binding="Binding AdornedElement.Text.Length, ElementName=Placeholder" Value="0">
            <Setter Property="DockPanel.Dock" TargetName="Image" Value="Left"/>
            <Setter Property="Margin" TargetName="Image" Value="-20,-2"/>
        </DataTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

【讨论】:

非常好!非常感谢,我不得不将值更改为 2 但这是因为我在文本框多绑定中有两个空格 =))

以上是关于Wpf文本框验证控件模板触发文本值的主要内容,如果未能解决你的问题,请参考以下文章

Access 2016 表单控件验证规则未触发

winform,自定义文本框控件 实现文本框验证加水印功能

WPF 文本框 RaiseEvent

控件中数据模板禁用小键盘减号折叠

WPF-验证-验证错误消息由于 AdornerDecorator 而落后于其他控件

WPF 自定义控件将文本框文本重置为默认值