我使用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>
和ErrorConverter:
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更改而触发器触发器 - >假 - &gt;真。
有没有人对此有任何经验或有关如何强制触发的建议?
答案 0 :(得分:3)
这似乎就是答案:IDataErrorInfo With Multiple Error Messages for a Property
基本上,您绑定到当前项并使用ContentPresenter来显示错误。它适用于我的代码。
答案 1 :(得分: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}"/>
问题已解决。
结论 - 请勿使用转换器。
答案 2 :(得分:0)
我有一个类似的问题,解决该问题的方法是按照Allan的回答删除转换器。
但是我没有使用current record pointer来获取当前项目,而是使用诸如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