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

时间:2014-04-12 23:28:32

标签: c# wpf xaml

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

初始化代码:

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

XAML:

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

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

  

System.Windows.Data错误:7:ConvertBack无法转换值   'dfddddddf'(输入'String')。 BindingExpression:路径=价格;   DataItem ='DataRowView'(HashCode = 35888470);目标元素是   'TextBox'(Name =''); target属性是'Text'(类型'String')   出现FormatException:'System.FormatException:

如何重现这个错误?怎么抓住它扔?为什么它会以静默方式屏蔽异常?

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

1 个答案:

答案 0 :(得分:1)

可能WPF不会抛出这些错误,因为无法捕获它们。但是,在这种情况下,您的ViewModel Price值没有更改,因此无需担心无效值。你可以尝试使用验证(当异常激活时,应该用红色包围文本框的东西)Some documentation

控制行为的方法是使用您想要的逻辑定义您自己的转换器:

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

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

另一种方法是将此逻辑设置为特定的TextBox控件或ViewModel端(将Price type设置为string并管理ViewModel中的转换)。