2013-10-19 101 views
1

我已经构建了一个表单来编辑我的WPF应用程序中的数据。我正在为表单添加验证。我从this articlethis one开始,但是错误模板或者全部显示,或者根本不显示。我不知道我做错了什么。我正在使用的是ControlTemplateStyle。他们是在窗体的资源:TextBox验证不显示错误

<ControlTemplate x:Key="TextBoxErrorTemplate"> 
    <StackPanel ClipToBounds="False" Orientation="Horizontal"> 
     <Border BorderBrush="Red" 
       BorderThickness="1" 
       Margin="15,0,0,0"> 
      <AdornedElementPlaceholder Name="adornedElement" /> 
     </Border> 
     <Image HorizontalAlignment="Right" 
       VerticalAlignment="Top" 
       Width="20" 
       Height="20" 
       Margin="0,-5,-5,0" 
       Source="{StaticResource ErrorImage}" 
       ToolTip="{Binding Converter={StaticResource ErrorConverter}, 
           ElementName=adornedElement, 
           Path=AdornedElement.(Validation.Errors)}" /> 
    </StackPanel> 
</ControlTemplate> 

<Style x:Key="TextBoxErrorStyle" TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="ToolTip" 
        Value="Binding Converter={StaticResource ErrorConverter}, 
            RelativeSource={x:Static RelativeSource.Self}, 
            Path=AdornedElement.(Validation.Errors)}"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

这里是一个使用这些部件的TextBox

<TextBox Grid.Column="0" 
      Margin="5,0" 
      MaxLength="50" 
      Name="NameBox" 
      TabIndex="0" 
      Validation.ErrorTemplate="{StaticResource TextBoxErrorTemplate}" 
      Style="{StaticResource TextBoxErrorStyle}" 
      TextAlignment="Left" 
      TextChanged="NameBox_TextChanged" 
      VerticalAlignment="Center" 
      Visibility="{Binding Converter={StaticResource InvertedBoolToVisibility}, Path=AutoConfigureCameras, RelativeSource={RelativeSource AncestorType={x:Type cs:EditLPRDetails}}}"> 
    <TextBox.Text> 
     <Binding Mode="TwoWay" Path="Name" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <cs:RegexValidationRule Pattern="{StaticResource NamePattern}" /> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

注意的是,在RegexValidationRule类作品中的验证逻辑。当我将一个有效的字符串放入TextBox时,它会返回成功,并且当我将一个无效字符串放入它时,它将返回失败。无论怎样,我认为问题出在Style's Trigger

回答

0

我找到了答案,我的问题。

事实证明,我的对话框包含一个TabControl,这是问题的原因。我在this article找到了答案。基本上,我需要把TabItem的内容包含控件在AdornerDecorator控件中进行验证,该控件本身位于Border控件的内部。一旦完成,那么错误指示符都会正确显示。

我没有包括我的控件起初在TabControl之内的事实,因为我不知道它的重要性。活到老,学到老。

+0

该死的tabcontrol ...解决方案的荣誉!!! – Nitin

2

你是很近,SetterValue语法结合是不正确的,再加上你应该设置PathValidation.Errors

<Setter Property="ToolTip" 
     Value="{Binding Converter={StaticResource ErrorConverter}, 
         RelativeSource={x:Static RelativeSource.Self}, 
         Path=(Validation.Errors)}"/> 
+0

我错过了左开大括号。我完全错过了,甚至没有看到它。现在,工具提示出现并正确读取,但红色边框和位图仍然不显示 –

+0

,那么问题出在绑定属性上。您可以检查在Textbox的DataContext中是否正确定义了Name属性? – Nitin

+0

DataContext设置在'Window'级别。 TextBox的Text属性绑定到ViewModel对象的Name属性。当它显示一个已存在的对象时,正确的值显示在“TextBox”中,这样​​'Binding'是正确的。我在'ToolTip Binding'中使用的'IValueConverter'中放置了一个断点,并且我已经看到该断点被击中。我不确定你在说什么绑定。 –