【问题标题】:How to retrieve images from SQL Server database into WPF form?? (LINQ, Databinding, SQL)如何将 SQL Server 数据库中的图像检索到 WPF 表单中? (LINQ、数据绑定、SQL)
【发布时间】:2010-12-11 17:51:03
【问题描述】:

我有一个便宜的窗口,我可以在其中将数据插入数据库。我的数据库列如下:

col name(varchar),  
col age (int),  
col photo (image) (all NOT NULL)

现在我想将数据库中的信息检索到我的窗口中。我有一个列表框,我可以在其中检索这样的名称(LINQ 查询)

public void updateListbox(){
DataClasses1DataContext dc = new DataClasses1DataContext();
var query = from s in dc.tablename select s;

_listBox1.ItemsSource = query.ToList();
}

我用于绑定的 xaml 代码如下所示:

<ListBox ... DisplayMemberPath="Name"/>

所以名称现在显示在列表框中。

我的下一步是显示在我的窗口/表单的列表框中选择的代表人的图像/照片。我在这样的文本块中使用 age 属性做到了:

<TextBlock ... Text="{Binding ElementName=_listBox1, Path=SelectedItem.Age}" />

但我不知道如何将图像检索到我的 wpf 窗口中。

我这样保存图片

byte[] image = File.ReadAllBytes(@imagepath);
...
sqlcommandobject.Parameters.Add(new SqlParameter("@Photo", image));
...

通过在插入到数据库之前使用 openFileDialog 加载图像(-path)。只是检索是我现在的问题。我现在真的很想保持绑定尽可能简单,但我想没有办法通过执行以下操作来检索图像:

<Image ... Source="{Binding ElementName=_listBox, Path=SelectedItem.Photo}" />

由于必须将二进制数据转换回图像对象(?),我不知道如何做到这一点并将其与绑定结合起来。有人有想法吗?

感谢阅读!

【问题讨论】:

    标签: sql-server wpf linq data-binding


    【解决方案1】:

    您可以创建一个转换器将值从byte[] 转换为BitmapSource

    [ValueConversion(typeof(byte[]), typeof(BitmapSource))]
    public class ByteArrayToImageConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            byte[] bytes = (byte[]) value;
            using (MemoryStream ms = new MemoryStream(bytes))
            {
                BitmapImage image = new BitmapImage();
                image.BeginInit();
                image.StreamSource = ms;
                image.EndInit();
                return image;
            }
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            BitmapSource image = (BitmapSource) value;
            BitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(image));
            using (MemoryStream ms = new MemoryStream())
            {
                encoder.Save(ms);
                return ms.ToArray();
            }
        }
    }
    

    ConvertBack 方法编码为 PNG,您可能需要根据需要更改它。或者您可能根本不需要 ConvertBack...)

    【讨论】:

      【解决方案2】:

      将图像绑定到ObjectDataProvider,将参数转换为图像。

      【讨论】:

        猜你喜欢
        • 2018-07-28
        • 1970-01-01
        • 2013-07-25
        • 2016-10-18
        • 2016-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多