2010-12-11 31 views
0

J'ai une fenêtre cheapo où j'insère des données dans une base de données. Mes db-colonnes sont les suivantes:Comment récupérer des images à partir de la base de données SQL Server dans le formulaire WPF? (LINQ, Databinding, SQL)

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

Maintenant, je veux récupérer l'information de la DB dans ma fenêtre. J'ai une zone de liste où je récupère les noms comme celui-ci (requête LINQ)

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

_listBox1.ItemsSource = query.ToList(); 
} 

Mon code XAML pour la liaison ressemble à ceci:

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

de sorte que les noms sont désormais affichées dans la liste.

L'étape suivante consiste à afficher l'image/photo de la personne représentative sélectionnée dans la zone de liste sur ma fenêtre/formulaire. Je l'ai fait avec la propriété d'âge dans un TextBlock comme ceci:

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

, mais je ne sais pas comment récupérer l'image dans la fenêtre de ma WPF.

J'enregistrer l'image comme celui-ci

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

en utilisant OpenFileDialog pour charger l'image (-path) avant insterting dans la db. Juste récupérer est mon problème maintenant. Je voudrais vraiment garder la liaison aussi simple qu'il est à ce moment, mais je suppose qu'il n'y a aucun moyen de récupérer l'image en faisant quelque chose comme ceci:

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

Comme les données binaires doit être reconverti à un objet image (?), et je suis perdu sur la façon de le faire et de le conbiner avec les fixations. Quelqu'un a une idée?

Merci d'avoir lu!

Répondre

2

Vous pouvez créer un convertisseur pour convertir la valeur de 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(); 
     } 
    } 
} 

(La méthode ConvertBack code au format PNG, vous pouvez changer cela en fonction de vos besoins ou vous ne pourriez pas besoin ConvertBack du tout ...)