wpf - 如何处理值转换器中的异常,以便显示自定义错误消息

标签 wpf data-binding ivalueconverter

我有一个文本框,它绑定(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 中捕获了异常,所以我的具体问题是:
  • 你什么时候会在 ValueConverter 上使用 TypeConverter
  • 假设 TypeConverter 不是上述问题的答案,我如何在 UI
  • 中显示我的自定义错误消息

    最佳答案

    我会使用 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>
    

    screenshot

    关于wpf - 如何处理值转换器中的异常,以便显示自定义错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6123880/

    相关文章:

    c# - 在 WPF 中绘制 sin 函数

    javascript - on-change 和 ng-change 的区别

    WPF 在绑定(bind)失败时应用触发器

    f# - 确定任何类型的列表、序列、数组或 IEnumerable 是否为空

    c# - 具有绑定(bind)依赖属性的 IValueConverter

    .net - 在 WPF 中托管浏览器

    c# - 在 VS 2010 的 Winforms 项目中添加 WPF 窗口

    WPF 多重组合几何

    WPF 上下文菜单未绑定(bind)到正确的数据绑定(bind)项

    c# - WPF 字符串到双转换器