我有一个二进制类型属性的数据库。我希望能够将字节数组插入数据库并将其拉出并显示图像。我设置代码的方式我真的希望能够将我的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'”。但是,如果我再次构建,它会运行。您是否看到我的代码存在任何可能阻止转换器更改字符串的问题?再次谢谢!
答案 0 :(得分:3)
在getter中将byte[]
转换为Image
是一个坏主意。这可能是一项代价高昂的操作,属性适用于相对简单的传递式访问,可能还有一些错误检查或内部状态管理。
相反,如何定义一个简单的Converter来为你完成这项工作?您可以绑定到byte[]
属性,但使用转换器将其转换为图像。