WPF双向绑定会话错误被隐藏

本文关键字:错误 隐藏 会话 绑定 WPF | 更新日期: 2023-09-27 17:58:07

我想将DataRowView绑定到我的窗口上的控件。

初始化代码:

...
row = query.DefaultView[0];
DataContext = row;

XAML:

<TextBox Text="{Binding Path=Price, Mode=TwoWay}"/>

当TextBox失去焦点时,它会尝试更新一行。有时它会失败,因为"价格"列是整数。但它并没有抛出错误,而是将其写入调试控制台:

System.Windows.Data错误:7:ConvertBack无法转换值"dfddddddf"(类型为"String")。BindingExpression:Path=价格;DataItem="DataRowView"(哈希代码=35888470);目标元素是"TextBox"(名称=");目标属性为"Text"(类型为"String")FormatException:"System.FormatException:

如何让这个错误重见天日?如何接球和投球?为什么它会默默地掩盖一个异常而吞下这个错误?

我知道它可以通过绑定中的字段格式规范来解决。我会写的,但我仍然不想有救生圈来保护我免受突然的谈话错误。

WPF双向绑定会话错误被隐藏

也许WPF不会抛出这些错误,因为不可能捕捉到它们。然而,在这种情况下,您的ViewModel价格值没有更改,因此无需担心无效值。您可以尝试使用验证(当异常静默触发时,应该用红色包围文本框的东西)一些文档。

要控制行为,你可以用你想要的逻辑定义你自己的转换器:

public class IntToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int price = (int)value;
        return price.ToString();
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string text = (string)value;
        int price;
        if (!int.TryParse(text, out price))
        {
            MessageBox.Show("Enter valid value for Price!");
            return 0; //Some default value
        }
        return price;
    }
}

在这种情况下,如果price不是有效的int,它将被0替换。您也可以抛出异常,但这将导致整个应用程序崩溃。

另一种方法是将此逻辑设置到特定的TextBox控件或ViewModel侧(将Price类型设置为字符串并管理ViewModel中的转换)。