我有一个文本框,它绑定(bind)到具有 Timespan 类型属性的类,并编写了一个值转换器来将字符串转换为 TimeSpan。
如果在文本框中输入了非数字,我希望显示自定义错误消息(而不是默认的“输入字符串格式错误”)。
转换器代码为:
public object ConvertBack(
object value,
Type targetType,
object parameter,
CultureInfo culture)
{
try
{
int minutes = System.Convert.ToInt32(value);
return new TimeSpan(0, minutes, 0);
}
catch
{
throw new FormatException("Please enter a number");
}
}
我在 XAML 绑定(bind)中设置了“ValidatesOnExceptions=True”。
但是,我遇到了以下 MSDN 文章,它解释了为什么上述方法不起作用:
“数据绑定(bind)引擎不会捕获用户提供的转换器引发的异常。任何由 Convert 方法引发的异常,或由 Convert 方法调用的方法引发的任何未捕获的异常,都被视为运行时错误”
我已经读到'ValidatesOnExceptions 确实在 TypeConverters 中捕获了异常,所以我的具体问题是:
最佳答案
我会使用 ValidationRule
为此,转换器可以确保转换工作正常,因为只有在验证成功时才会调用它,并且您可以使用附加属性 Validation.Errors
其中将包含您的 ValidationRule
的错误如果输入不是您想要的方式,则创建。
例如(注意工具提示绑定(bind))
<TextBox>
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Background" Value="Pink"/>
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
<TextBox.Text>
<Binding Path="Uri">
<Binding.ValidationRules>
<vr:UriValidationRule />
</Binding.ValidationRules>
<Binding.Converter>
<vc:UriToStringConverter />
</Binding.Converter>
</Binding>
</TextBox.Text>
</TextBox>
关于wpf - 如何处理值转换器中的异常,以便显示自定义错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6123880/