我想将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:
如何重现这个错误?怎么抓住它扔?为什么它会以静默方式屏蔽异常?
我知道它可以通过绑定中的字段格式规范来解决。我会写它,但我仍然不会有救生圈,这将保护我免受突然的对话错误。
答案 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中的转换)。