C# 隐藏WPF双向绑定对话错误

C# 隐藏WPF双向绑定对话错误,c#,wpf,xaml,C#,Wpf,Xaml,我想将DataRowView绑定到windows上的控件 初始化代码: ... row = query.DefaultView[0]; DataContext = row; XAML: 当文本框失去焦点时,它会尝试更新一行。有时它会失败,因为Price列是整数。但与其抛出错误,不如将其写入调试控制台: System.Windows.Data错误:7:ConvertBack无法转换值 'dfddf'(类型'String')。绑定表达式:路径=价格; DataItem='DataRowView

我想将DataRowView绑定到windows上的控件

初始化代码:

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


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

System.Windows.Data错误:7:ConvertBack无法转换值 'dfddf'(类型'String')。绑定表达式:路径=价格; DataItem='DataRowView'(HashCode=35888470);目标元素是 “文本框”(名称=“”);目标属性为“Text”(类型为“String”) FormatException:'System.FormatException:

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


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

可能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替换。您也可以抛出异常,但这将使整个应用程序崩溃

另一种方法是将此逻辑设置到特定的文本框控件或ViewModel端(将Price type设置为string并在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;
    }
}