【问题标题】:wpf targetting version 4.0 from 3.5 affects IDataErrorInfo implementation从 3.5 面向 4.0 版的 wpf 影响 IDataErrorInfo 实现
【发布时间】:2011-03-22 16:54:40
【问题描述】:

我有一个使用 3.5 版实现 IDataErrorInfo 的 MVVM 应用程序。我想尝试以 4.0 为目标,因此修改了 Target Framework 设置并更改了一些位(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 的实现有什么变化可以解释这个问题吗?知道如何解决吗?

【问题讨论】:

    标签: wpf idataerrorinfo


    【解决方案1】:

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

    【讨论】:

    • 我的绑定如下所示:。正如我所说,在进入 4.0 之前,这一切都运行良好
    【解决方案2】:

    好的,所以我已经解决了这个问题。我没有使用使用 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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多