wpf从3.5开始的目标版本4.0会影响IDataErrorInfo实现

时间:2011-03-22 16:54:40

标签: wpf idataerrorinfo

我有一个使用3.5版实现IDataErrorInfo的MVVM应用程序。我想尝试目标4.0,所以修改了目标框架设置并改变了一些位(BitmapFrames之类)。大多数事情似乎都很好,而且过程相对无痛,直到我注意到IDataErrorInfo的实现已经受到影响。

我的验证控件模板如下所示:

    <ControlTemplate x:Key="temp__">
    <Border BorderBrush="Orange" BorderThickness="2" CornerRadius="4" SnapsToDevicePixels="True">    
        <DockPanel>         
        <Image HorizontalAlignment="Left" VerticalAlignment="Center" 
                         Width="16" Height="16" Margin="-20,0,0,0" 
                         Source="{StaticResource ErrorIcon}" 
                         ToolTip="{Binding ElementName=adornedElement, 
                                             Path=AdornedElement.(Validation.Errors), 
                                             Converter={helper:ValidationErrorsToStringConverter}}"/>
        <AdornedElementPlaceholder Name="adornedElement"/>
    </DockPanel>
    </Border>
</ControlTemplate>

并以如下文本框样式使用:

<Setter Property="Validation.ErrorTemplate" Value="{DynamicResource error_holder}">

在我的ViewModel中,GetValidationError(string propertyName)使用开关根据我的规则验证相应的属性。

问题是,一旦验证被解雇,它就不会更新。例如,可以根据需要设置字段。加载后,所需的字段将被标记为无效,并带有相应的消息。以前,当输入的值仍然无效时,工具提示中的错误消息将更新。但是,这不再有效,错误消息仍然保留为空值消息。

有没有人知道4.0中IDataErrorInfo的实现有哪些变化可能会导致这种情况?知道怎么解决吗?

2 个答案:

答案 0 :(得分:0)

我看不到您的绑定,但您应该添加ValidatesOnDataErrors。

答案 1 :(得分:0)

好的,所以我解决了这个问题。而不是使用使用Validation.Errors [0]的默认实现,它在错误修复时给出绑定错误,我使用了转换器。不知道为什么这会导致最初描述的行为,但确实如此。所以我最初改回使用Validation.Errors [0]并正确更新错误消息。但是,这会导致返回绑定错误。相反,我在这里实施了建议prevent binding errors,问题得到了解决。

我的ControlTemplate现在看起来像这样:

  <ControlTemplate x:Key="temp__">
<DockPanel LastChildFill="True">
  <Border BorderBrush="Orange" BorderThickness="2" CornerRadius="4" SnapsToDevicePixels="True">
    <Border.Effect>
      <DropShadowEffect ShadowDepth="0" Color="Orange" BlurRadius="10" />
    </Border.Effect>
    <DockPanel>          
      <Image HorizontalAlignment="Left" VerticalAlignment="Center"
                         Width="16" Height="16" Margin="-20,0,0,0" 
                         Source="{DynamicResource ErrorIcon}"               
             ToolTip="{Binding ElementName=adornedElement, 
                               Path=AdornedElement.(Validation.Errors)/ErrorContent}"/>
      <AdornedElementPlaceholder Name="adornedElement"/>
    </DockPanel>        
  </Border>
</DockPanel>

但是,以前必填字段在加载时被标记为错误,这不再发生。只有在用户输入时发生另一个错误时才会出现验证。我该如何解决这个问题?