以3.5版的4.0版为目标的wpf会影响IDataErrorInfo的实现

以3.5版的4.0版为目标的wpf会影响IDataErrorInfo的实现,wpf,idataerrorinfo,Wpf,Idataerrorinfo,我有一个使用3.5版实现IDataErrorInfo的MVVM应用程序。我想尝试将目标定为4.0,因此修改了目标框架设置,并对BitmapFrames等进行了一些更改。在我注意到IDataErrorInfo的植入受到影响之前,大多数事情看起来都很好,整个过程也相对无痛 我的验证控件模板如下所示: <ControlTemplate x:Key="temp__"> <Border BorderBrush="Orange" BorderThickness="2" Co

我有一个使用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}">
  <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>
并在文本框样式中使用,如下所示:

    <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}">
  <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>
在我的ViewModel中,GetValidationErrorstring propertyName使用一个开关根据我的规则验证适当的属性

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


有人知道在4.0中IDataErrorInfo的实现中有什么变化可以解释这一点吗?知道如何修复它吗?

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

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

我的ControlTemplate现在如下所示:

    <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}">
  <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>
但是,如果以前在加载时将必填字段标记为错误,则不再发生这种情况。验证仅在由于用户输入而发生另一个错误时出现。如何修复此问题?

我的绑定看起来像这样:。正如我所说,在转到4.0之前,这一切都很好