如果我将WPF控件绑定到数据源并在Binding对象上将ValidatesOnExceptions设置为true。现在,如果我在控件中写了一些无法转换为源数据类型的内容,我将在控件上出现验证错误和红色边框。
但是如果我在源上设置了一个不兼容的值,则会在绑定中隐藏异常,并返回一个默认值。由于绑定错误,没有迹象表明控件中的值不可信任。
如何将绑定问题可视化为用户,无论哪一方是它的原因?我希望用户知道控件中的值不可靠。
更多信息:
这就是我追踪的内容。它告诉我在转换期间抛出了OverflowException(因为99999不适合Int16)。然后,当在目标上设置值时,它只使用0而不是99999。没关系,我不指望它做不可能的事。问题是它没有让我选择对错误采取行动,并且没有找到验证错误。
从DataClass获得PropertyChanged事件(hash = 2616333)
使用RuntimePropertyInfo(Int32)从DataClass(hash = 2616333)获取级别0的GetValue:'99999'
TransferValue - 原始值'99999'
mscorlib.dll中发生了'System.OverflowException'类型的第一次机会异常
System.Windows.Data错误:6:'SystemConvertConverter'转换器无法转换值'99999'(类型'Int32');如果可用,将使用后备值。 BindingExpression:路径=的Int32; DataItem ='DataClass'(HashCode = 2616333); target元素是'AliasClass'(HashCode = 32866918);目标属性是'Int16'(类型'Int16')OverflowException:'System.OverflowException:对于Int16,值太大或太小。
TransferValue - 隐式转换器生成{DependencyProperty.UnsetValue}
TransferValue - 使用回退/默认值'0'
TransferValue - 使用最终值'0'
答案 0 :(得分:0)
为了可视化绑定问题,我知道有两种方法:
1)创建一个只返回值的IValueConverter,并检查该值 这对于确保传递的变量是您想要的变量特别有用 它是这样的:
public class BindingTestConverter : IValueConverter, IMultiValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
#region IMultiValueConverter Members
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return values;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
2)使用PresentationTraceSource:
<UserControl (...) PresentationTraceSources.TraceLevel="High" (...) />
这将在visual studio的“输出窗口”中显示视图中的绑定错误。