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

问题描述 投票:0回答:1

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

初始化代码:

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

XAML:

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

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

System.Windows.Data 错误:7:ConvertBack 无法转换值 “dfddddddf”(类型“字符串”)。 BindingExpression:路径=价格; DataItem='DataRowView'(哈希码=35888470);目标元素是 '文本框'(名称='');目标属性是“文本”(类型“字符串”) FormatException:'System.FormatException:

如何让这个错误重新曝光?如何接住并扔掉?为什么它会默默地吞下这个错误并掩盖异常?

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

c# wpf xaml
1个回答
1
投票

不可能捕获这些类型的错误。但是,在这种情况下,您的 ViewModel

Price
值没有更改,因此您无需担心无效值。您可以尝试使用验证(当异常默默触发时,应该用红色包围文本框的东西)一些文档

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

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;
    }
}

在这种情况下,如果价格不是有效的整数,价格将被 0 替换。您也可以抛出异常,但这会使整个应用程序崩溃。

另一种方法是将此逻辑设置到特定的

TextBox
控件中或 ViewModel 端(将
Price
类型设置为字符串并管理 ViewModel 中的转换)。

© www.soinside.com 2019 - 2024. All rights reserved.