getter用于返回Image对象的byte []对象

时间:2011-07-01 19:29:23

标签: c#

我有一个二进制类型属性的数据库。我希望能够将字节数组插入数据库并将其拉出并显示图像。我设置代码的方式我真的希望能够将我的byte []转换为getter方法中的图像,希望能够显示图像。

我运行的代码是:

[PropertyDefinition("0B79C12F-21F4-4ECA-BF4F-E694B9DE73DB")]
[Display(Name = "Computer_AgentLastContactedIcon", Description = "Computer_AgentLastContactedIcon_Desc", Order = 5, ResourceType = typeof(EntityMetadataStrings))]
public byte[] AgentLastContactedIcon { get; set; }

问题是,这会在我的数据网格中显示“System.Byte []”而不是图像。

在显示图像的attemt中,我将getter和setter方法更改为以下内容:

[PropertyDefinition("0B79C12F-21F4-4ECA-BF4F-E694B9DE73DB")]
[Display(Name = "Computer_AgentLastContactedIcon", Description                                       = "Computer_AgentLastContactedIcon_Desc", Order = 5, ResourceType = typeof(EntityMetadataStrings))]
public byte[] AgentLastContactedIcon;
public Image _AgentLastContactedIcon
{
    get
    {
        MemoryStream ms = new MemoryStream(AgentLastContactedIcon);
        Image img = Image.FromStream(ms);
        return img;
    }
    set
    {
        ImageConverter converter = new ImageConverter();
        byte[] array = (byte[])converter.ConvertTo(value, typeof(byte[]));
        AgentLastContactedIcon = array;
    }
}

我收到此错误: “属性'PropertyDefinition'在此声明类型上无效。它仅对'property,indexer'声明有效。”

根据我在另一篇关于堆栈溢出的帖子中发现的建议,我移动了“public byte [] agentLastContactedIcon;”以上:

public byte[] AgentLastContactedIcon;

[PropertyDefinition("0B79C12F-21F4-4ECA-BF4F-E694B9DE73DB")]
[Display(Name = "Computer_AgentLastContactedIcon", Description = "Computer_AgentLastContactedIcon_Desc", Order = 5, ResourceType = typeof(EntityMetadataStrings))]            
public Image _AgentLastContactedIcon
{
    get
    {
        MemoryStream ms = new MemoryStream(AgentLastContactedIcon);
        Image img = Image.FromStream(ms);
        return img;
    }
    set
    {
        ImageConverter converter = new ImageConverter();
        byte[] array = (byte[])converter.ConvertTo(value, typeof(byte[]));
        AgentLastContactedIcon = array;
    }
}

但是这样做给了我错误:“类型'X'的关联元数据类型包含以下未知属性或字段:_AgentLastContactedIcon。请确保这些成员的名称与主类型上的属性名称匹配

我正在使用以下silverlight来显示数据库中的项目:

<ctrls:CustomDataGrid
    x:Name="ComputersDataGrid"
    Grid.Row="1"
    Style="{StaticResource DataGridStyle}"
    ItemsSource="{Binding ItemsSource}"
    SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
    SelectionMode="{Binding SelectionMode}"
    PropertyDefinitions="{Binding PropertyDefinitions}" />

提前感谢您的帮助!


感谢您提供实施转换器的好建议。我在使用它时遇到了一些麻烦。我只是想在这里将一个字符串转换为另一个字符串,看它是否有效。这是我的样本转换器:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Globalization;
    using System.Windows.Data;

    namespace IAS.Shared.Web.Resources
    {
[ValueConversion(typeof(string), typeof(string))]
public class ImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        String str = (string)value;
        str = "changed";
        return str;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string str = (string)value;
        str = "changedBack";
        return str;
    }
}

}

我尝试在我的.xaml文件中使用它:

    xmlns:converter="clr-namespace:AccessData.IAS.Shared.Web.Resources"

这里:

    <UserControl.Resources>
    <converter:ImageConverter x:Key="ImageConverter" />

在这里:

    <ctrls:CustomDataGrid x:Name="ComputersDataGrid"
                       Grid.Row="1"
                       Style="{StaticResource DataGridStyle}"
                       ItemsSource="{Binding ItemsSource, Converter={StaticResource ImageConverter}}"
                       SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
                       SelectionMode="{Binding SelectionMode}"
                       PropertyDefinitions="{Binding PropertyDefinitions}">

我的字符串不会改变。我也得到了buid错误“类型'转换器:找不到ImageConverter。验证你没有错过一个程序集引用,并且已经构建了所有引用的程序集”和“XML命名空间中不存在标记'ImageConverter' 'CLR命名空间:IAS.Shared.Wen.Resources'”。但是,如果我再次构建,它会运行。您是否看到我的代码存在任何可能阻止转换器更改字符串的问题?再次谢谢!

1 个答案:

答案 0 :(得分:3)

在getter中将byte[]转换为Image是一个坏主意。这可能是一项代价高昂的操作,属性适用于相对简单的传递式访问,可能还有一些错误检查或内部状态管理。

相反,如何定义一个简单的Converter来为你完成这项工作?您可以绑定到byte[]属性,但使用转换器将其转换为图像。