C # WPF - Bild von bytearray in Datagrid laden
Ich habe ein WPF-Formular (ich bin ein Anfänger in WPF), das ein @ enthälDatagrid
. DiesDatagrid
erhält seinen Inhalt durch ein einfachesList<AudioFile>
. In der KlasseMp3File
das erstreckt sichAudioFile
(In einer PCL) ist eine Methode namensGetCoverAsByteArray()
, das das Cover eines geladenen @ zurückgiAudioFile
Als einbyte[]
. Jetzt möchte ich das Titelbild im @ zeigDataGrid
, aber ich weiß nicht, wie es geht. Kannst du mir bitte helfen
Hier ist der Code, den ich bisher habe:
<DataGrid x:Name="tvFiles" AutoGenerateColumns="False" MaxColumnWidth="1000" Margin="10,95,10,10" MinHeight="100">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Cover" Width="*" MinWidth="64">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Filename" Width="*" MinWidth="100" Binding="{Binding Filename}"/>
<DataGridTextColumn Header="Artist" Width="*" MinWidth="50" Binding="{Binding Artist}"/>
<DataGridTextColumn Header="Title" Width="*" MinWidth="50" Binding="{Binding Title}"/>
<DataGridTextColumn Header="Album" Width="*" MinWidth="50" Binding="{Binding Album}"/>
<DataGridTextColumn Header="BPM" Width="*" MinWidth="50" Binding="{Binding BPM}"/>
<DataGridTextColumn Header="Comment" Width="*" MinWidth="100" Binding="{Binding Comment}"/>
<DataGridTextColumn Header="Year" Width="*" MinWidth="40" Binding="{Binding Year}"/>
<DataGridTextColumn Header="Key" Width="*" MinWidth="40" Binding="{Binding Key}"/>
<DataGridTextColumn Header="Bitrate" Width="*" MinWidth="60" Binding="{Binding Bitrate}"/>
<DataGridTextColumn Header="Length" Width="*" MinWidth="50" Binding="{Binding Duration}"/>
</DataGrid.Columns>
</DataGrid>
ielen Dank für jede Hil
EDIT 1
Ich habe einen Konvertierten implementiert, wie Dennis gesagt hat, und jetzt sieht mein Code so aus:
class ByteArrayToImageConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
byte[] bytes = (byte[])value;
if (bytes == null || bytes.Length == 0) return null;
var image = new BitmapImage();
using (var mem = new MemoryStream(bytes)) {
mem.Position = 0;
image.BeginInit();
image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = null;
image.StreamSource = mem;
image.EndInit();
}
image.Freeze();
return image;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
throw new NotImplementedException();
}
}
<Window.Resources>
<local:ByteArrayToImageConverter x:Key="converter" />
</Window.Resources>
<DataGrid x:Name="tvFiles" AutoGenerateColumns="False" MaxColumnWidth="1000" Margin="10,95,10,10" MinHeight="100">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Cover" Width="*" MinWidth="64">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding GetCoverAsByteArray, Converter={StaticResource converter}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Filename" Width="*" MinWidth="100" Binding="{Binding Filename}"/>
<DataGridTextColumn Header="Artist" Width="*" MinWidth="50" Binding="{Binding Artist}"/>
<DataGridTextColumn Header="Title" Width="*" MinWidth="50" Binding="{Binding Title}"/>
<DataGridTextColumn Header="Album" Width="*" MinWidth="50" Binding="{Binding Album}"/>
<DataGridTextColumn Header="BPM" Width="*" MinWidth="50" Binding="{Binding BPM}"/>
<DataGridTextColumn Header="Comment" Width="*" MinWidth="100" Binding="{Binding Comment}"/>
<DataGridTextColumn Header="Year" Width="*" MinWidth="40" Binding="{Binding Year}"/>
<DataGridTextColumn Header="Key" Width="*" MinWidth="40" Binding="{Binding Key}"/>
<DataGridTextColumn Header="Bitrate" Width="*" MinWidth="60" Binding="{Binding Bitrate}"/>
<DataGridTextColumn Header="Length" Width="*" MinWidth="50" Binding="{Binding Duration}"/>
</DataGrid.Columns>
</DataGrid>
Jetzt erhalte ich die folgende Meldung, wenn ich eine Audiodatei in das Datagrid lade:
System.Windows.Data Fehler: 40: BindingExpression-Pfadfehler: 'GetCoverAsByteArray ()' Eigenschaft für 'Objekt' '' Mp3File '(HashCode = 54312533)' nicht gefunden. BindingExpression: Path = GetCoverAsByteArray (); DataItem = 'Mp3File' (HashCode = 54312533); Zielelement ist 'Image' (Name = ''); Zieleigenschaft ist 'Source' (Typ 'ImageSource')
System.Windows.Data Fehler: 40: BindingExpression-Pfadfehler: Die Eigenschaft 'Key' wurde für 'object' '' Mp3File '(HashCode = 54312533)' nicht gefunden. BindingExpression: Path = Key; DataItem = 'Mp3File' (HashCode = 54312533); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String')