转换器返回不同类型?

时间:2012-02-21 08:47:03

标签: c# wpf image return-type ivalueconverter

我有List<Employee>。每个Employee都有一个存储图片的byte [](或null)。我需要以某种方式将此字节数组绑定到我正在使用的内容模板上的图像控件,或者如果Employee没有图片我想显示本地jpg文件。我想出的方法是定义一个转换器,它将返回BitmapImage(GetImageFromByteArray()方法的返回类型)或字符串(文件名的路径)。这显然意味着这个方法能够返回两种类型,但我不会认为这是一个问题,就像我已经将返回类型指定为对象一样。

无论如何,这是我的C#:

public class GuidToImageConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                Guid id = new Guid(value.ToString());
                Employee employee = Employees.SingleOrDefault(o => o.Id.Equals(id));
                return employee.Picture != null ? GetImageFromByteArray(employee.Picture) : "/Resource/images/silhouette.jpg";
            }

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

在XAML中使用如下:

    <local:GuidToImageConverter x:Key="GuidToImageConverter"/>

    <local:OrientedGroupHeaderContentTemplateSelector x:Key="GroupHeaderContentTemplateSelector">
        <!-- Default templates: -->
        <local:OrientedGroupHeaderContentTemplateSelector.HorizontalMonthViewDateTemplate>
            <DataTemplate>
                <Image Width="60" Height="60" Margin="5 0 10 0" HorizontalAlignment="Left" Stretch="UniformToFill" Source="{Binding Path=Name.Id, Converter={StaticResource GuidToImageConverter}, ConverterParameter=1}" />
            </DataTemplate>
        </local:OrientedGroupHeaderContentTemplateSelector.HorizontalMonthViewDateTemplate>
    </local:OrientedGroupHeaderContentTemplateSelector>

错误:

“错误1 - 无法确定条件表达式的类型,因为'System.Windows.Media.Imaging.BitmapImage'和'string'之间没有隐式转换”

据我所知,如果有适当的MVVM结构,这可能不会成为问题,但目前无法改变这一点。

1 个答案:

答案 0 :(得分:4)

将return语句更改为此项以使其正常工作:

if(employee.Picture != null)
    return GetImageFromByteArray(employee.Picture)
return "/Resource/images/silhouette.jpg";

或者您可以先从“默认图像”创建图像,然后就可以像以前一样使用return语句。