设置“DependencyProperty.UnsetValue;”时出现绑定错误

时间:2016-02-10 17:34:54

标签: wpf ivalueconverter

我在我的视图中有这个变量绑定:

<Image Source="{Binding Path=GrappleTypeVar, Source={StaticResource CustomerData}, Converter={StaticResource GrappleDataConverter}}" Width="40" Height="40"/>

然后,这个转换器:

public class GrappleDataConverter : IValueConverter
{
    public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null)
        {
            int currentType = (int)value;

            if (Enum.IsDefined(typeof(GrappleType), currentType))
            {
                switch ((GrappleType)currentType)
                {
                    case GrappleType.Hydraulic:
                        return String.Empty;
                    case GrappleType.Parallel:
                        return "/GUI;component/Images/040/SensorSoft.png";
                }
            }
        }
        // Not defined... Set unknown image
        return String.Empty;
    }

    public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new System.NotImplementedException();
    }
}

使用该代码,我的结果窗口返回了许多类型的绑定错误:

System.Windows.Data信息:10:无法使用绑定检索值,并且不存在有效的回退值;使用默认值。 BindingExpression:路径= GrappleTypeVar; DataItem ='CustomerData'(HashCode = 50504364); target元素是'Image'(Name =''); target属性是'Source'(类型'ImageSource') System.Windows.Data错误:23:无法将''从类型'String'转换为'en-US'文化的'System.Windows.Media.ImageSource',默认转换为;考虑使用Binding的Converter属性。 NotSupportedException:'System.NotSupportedException:ImageSourceConverter无法从System.String转换。

回顾那个错误,我找到了解决方案: ImageSourceConverter error for Source=null

我改变了我的代码:

case GrappleType.Hydraulic:
    return String.Empty;

代表

case GrappleType.Hydraulic:
    return DependencyProperty.UnsetValue;

现在应用程序运行更顺畅,但在结果窗口中出现以下绑定错误: System.Windows.Data信息:10:无法使用绑定检索值,并且不存在有效的回退值;使用默认值。 BindingExpression:路径= GrappleTypeVar; DataItem ='CustomerData'(HashCode = 62171008); target元素是'Image'(Name =''); target属性是'Source'(类型'ImageSource')

有人可以给我一些帮助吗?有可能解决这个错误吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您的转换器应返回与目标属性类型匹配的值,即从ImageSource派生的类型的实例。这通常是BitmapImageBitmapFrame。如果不显示图像,则应返回null

public object Convert(
    object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    object result = null;

    if (value is GrappleType)
    {
        switch ((GrappleType)value)
        {
            case GrappleType.Hydraulic:
                break;

            case GrappleType.Parallel:
                result = new BitmapImage(new Uri(
                    "pack://application:,,,/GUI;component/Images/040/SensorSoft.png"));
                break;
        }
    }

    return result;
}

请注意转换器如何使用Resource File Pack URI创建BitmapImage。