2010-12-11 43 views
0

我有一個便宜的窗口,我將數據插入數據庫。我的db列是以下內容:如何從SQL Server數據庫檢索圖像轉換爲WPF格式? (LINQ,Databinding,SQL)

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"/> 

這樣的名字現在被顯示在列表框中。

我的下一步是顯示在我的窗口/窗體的列表框中選擇的代表人員的圖像/照片。我用這樣的textblock年齡屬性:

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

但我不知道如何檢索到我的wpf窗口的圖像。

我使用的OpenFileDialog insterting到分貝之前加載圖像(-path)保存圖像這樣

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

。現在只是檢索是我的問題。我真的想保持結合簡單,因爲它是在這一刻,但我想沒有辦法做這樣的事情來獲取圖像:

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

由於二進制數據轉換回到一個圖像對象(?),我迷失在如何做到這一點,並與綁定結合起來。任何人有想法?

感謝您的閱讀!

回答

2

您可以創建一個轉換器值從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根本...)

相關問題