2011-03-22 68 views
0

我有一个MVVM应用程序使用版本3.5实现IDataErrorInfo。我想尝试和目标4.0,所以已经修改了目标框架设置,并改变了一些位(BitmapFrames等)。大部分事情看起来都很好,而且这个过程相对来说是无痛的,直到我注意到IDataErrorInfo的实现已经受到影响。从3.5的wpf目标版本4.0影响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(字符串propertyName的)使用一个开关根据我的规则验证适当的属性。

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

有谁知道在4.0中的IDataErrorInfo的实现可能会造成这种情况的任何变化吗?任何想法如何解决它?

回答

0

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

我的控件模板现在看起来是这样的:

<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> 

然而,在以前是一个必填字段被标记为上载错误,这不再发生。验证只会在用户输入后发生另一个错误。我怎样才能解决这个问题?

0

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

+0

我的绑定看起来像这样:。正如我所说,这一切都工作正常之前,移动到4.0 – pilsdumps 2011-03-22 19:29:11