我想将 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:
如何让这个错误重新曝光?如何接住并扔掉?为什么它会默默地吞下这个错误并掩盖异常?
我知道可以通过绑定中的字段格式规范来解决。我会写它,但我仍然不想有救生圈来保护我免受突然的对话错误。
不可能捕获这些类型的错误。但是,在这种情况下,您的 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 中的转换)。