本地化ExceptionValidationRule

时间:2017-03-21 14:09:00

标签: wpf validation error-handling localization

绑定到double可能会产生以下验证错误

  

价值......无法转换。

使用ExceptionValidationRule时,错误更多是健谈

  

输入字符串的格式不正确。

     

价值太大或太小了......

也许还有更多。添加那些我可以将自己投入绑定属性设置器的内容。

现在,我想本地化这些消息(最好是第二版)。这并不是什么大惊喜,但是sources没有透露任何有用的东西(我看错了地方吗?)。

我可以制定自己的验证规则,但也许有一种更简单的方法?

我的问题:我可以本地化ExceptionValidationRule吗?

以下是mcve

XAML:

<TextBox>
    <TextBox.Text>
        <Binding Path="TestDouble" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <!--<local:MyValidationRule />-->
                <!--<ExceptionValidationRule />-->
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
    <Validation.ErrorTemplate>
        <ControlTemplate>
            <TextBlock Margin="0,20,0,0" Foreground="Red" Text="{Binding ErrorContent}" />
        </ControlTemplate>
    </Validation.ErrorTemplate>
</TextBox>

CS:

public partial class MainWindow : Window
{
    public double TestDouble { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }
}

public class MyValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo) => ValidationResult.ValidResult; // not used

    public override ValidationResult Validate(object value, CultureInfo cultureInfo, BindingExpressionBase owner)
    {
        var bindingExpression = owner as BindingExpression;
        if (bindingExpression != null)
        {
            var type = bindingExpression.ResolvedSource.GetType().GetProperty(bindingExpression.ResolvedSourcePropertyName).PropertyType;
            if (type == typeof(double))
            {
                double result;
                if (!double.TryParse((string)value, out result))
                    return new ValidationResult(false, "The value format is not recognized"); // custom message
            }
            ... // and so on, for all types ?????
        }
        return base.Validate(value, cultureInfo, owner);
    }
}

1 个答案:

答案 0 :(得分:0)

要更新在更新绑定源期间出现的此类错误消息,它足以设置绑定的UpdateSourceExceptionFilter回调处理程序,不需要自定义验证规则(ExceptionValidationRule是必需的)。

XAML:

<Binding UpdateSourceExceptionFilter="ExeptionFilter" ...>

CS:

object ExeptionFilter(object bindingExpression, Exception exception)
{
    return "Localized error message";
}

显然,可以switch / case(在C#7中,早期 - if/else if)提供特定于例外的消息(在我的问题中,这些消息是FormatException和{相应地{1}}。