3

我使用 MVVM,我的对象实现了 IDataErrorInfo。设置属性后,我运行自定义验证方法,如果验证通过,我返回 String.empty,它将 Validation.HasError 设置为 false。如果验证失败,则 Validation.HasError 设置为 true。我有一种用于“必需控件”(将执行验证的控件)的样式,并将控件的工具提示设置为如下错误:

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

和错误转换器:

public class ZynErrorContentConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var errors = value as ReadOnlyObservableCollection<ValidationError>;
        if (errors == null) return "";

        return errors.Count > 0 ? errors[0].ErrorContent : "";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

问题是这样的:用户输入了无效的内容......并且 Validation.HasError 设置为 true。工具提示会按预期更新。如果用户尝试更正错误,但输入的值会导致不同类型的失效,则工具提示应显示新的错误字符串,但这不会发生。该错误显示为与第一个错误相同的错误。我知道为什么会发生这种情况(我认为)......因为没有触发触发器,因为 Validation.HasError 永远不会从 True -> False -> True 改变。

有没有人对此有任何经验或关于如何强制触发的一些建议?

4

3 回答 3

3

这似乎是答案:IDataErrorInfo With Multiple Error Messages for a Property

基本上,您绑定到当前项目并使用 ContentPresenter 来显示错误。它适用于我的代码。

于 2011-04-01T13:56:52.477 回答
2

我相信我已经弄清楚了。罪魁祸首是转换器的使用。我遇到了同样的问题,问题代码片段是:

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

我将片段更改为:

<Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
        Path=(Validation.Errors)[0].ErrorContent}"/>

问题就解决了。

结论 - 不要使用转换器。

于 2013-09-11T05:40:24.090 回答
0

我有一个类似的问题,解决的方法是删除转换器,正如艾伦在他的回答中提到的那样。

但是,我没有使用ErrorContent诸如, 之类的按索引Path=(Validation.Errors)[0].ErrorContent,而是使用当前记录指针来获取当前项目。

这是它在代码中的样子:

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

更多信息可以在这里找到:https ://docs.microsoft.com/en-us/dotnet/api/system.windows.data.relativesource.self?view=netframework-4.8

于 2020-03-30T14:22:14.690 回答