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不会抛出这些错误,因为不可能捕捉到它们。然而,在这种情况下,您的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中的转换)。