2013-07-11 43 views
1

我需要你幫助我解決我遇到的問題。我有一個列表框,它應該在從數據庫中檢索它們之後顯示Car Detials(右側)和Car Image(左側)。注意:將字節轉換爲數據庫中的圖像,它工作正常。問題在於圖像不會顯示在列表框(左側)中,而只顯示「車輛詳細信息」。缺少圖片!我確保Car和CarImage以WPF風格進行綁定。不知道我在代碼或wpf風格上做了什麼錯誤。如果你願意看看我的代碼是什麼問題,我會非常讚賞。非常感謝您的幫助。謝謝!wpf - 爲什麼圖像不會顯示在列表框中,即使代碼中有圖像的值

WPF:

<ListBox Style="{DynamicResource ListBoxStyle1}" DisplayMemberPath="Car" X:Name="listboxCars" /> 

WPF樣式 - 汽車信息(右側)和汽車圖像(左側):

<DataTemplate x:Key="templateListBoxItem"> 
    <Grid Margin="5"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"></ColumnDefinition> 
      <ColumnDefinition Width="*"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition></RowDefinition> 
      <RowDefinition></RowDefinition> 
     </Grid.RowDefinitions> 
     <Border Grid.Column="0" 
      Grid.Row="0" 
      Grid.RowSpan="2" 
      Margin="0,0,10,0"> 
      <!-- binding it to Car Image from database --> 
      <Image Source="{Binding Path=CarImage}" 
       Stretch="Fill" 
       Height="40" 
       Width="40"></Image> 
     </Border> 
     <!-- same here to binding to Car --> 
     <TextBlock Text="{Binding Path=Car}" 
       FontWeight="Bold" 
       Grid.Column="1" 
       Grid.Row="0"></TextBlock> 
    </Grid> 
</DataTemplate> 

<Style x:Key="ListBoxStyle1" TargetType="{x:Type ListBox}"> 
    <Setter Property="ItemTemplate" Value="{StaticResource ResourceKey=templateListBoxItem}"></Setter> 

</Style> 

這種方法來獲取汽車信息與自己的圖片列表從數據庫

public List<CarInfo> GetCarImagesList (int days) 
{ 

Cars = new List<CarInfo>(); 
const string sqlQuery = "select Car, CarImage from CarTemplates where Days = @days order by Car asc"; 

      using (var command = new SqlCommand(sqlQuery, sqlConn)) 
      { 
       try 
       { 
        command.CommandType = CommandType.Text; 
        command.Parameters.AddWithValue("@days", days); 

        using (var reader = command.ExecuteReader()) 
        { 

         while (reader.Read()) 
         { 
          byte[] buffer = new byte[10000]; 
          var car = new CarInfo 
          { 
           Car = reader["Car"].ToString()                   
          }; 
          if (!reader.IsDBNull(reader.GetOrdinal("CarImage"))) 
          { 
           long size = reader.GetBytes(reader.GetOrdinal("CarImage"), 0, buffer, 0, 10000); 
           using (MemoryStream strm = new MemoryStream()) 
           { 
            strm.Write(buffer, 0, (int) size); 
            strm.Position = 0; 
            System.Drawing.Image img = System.Drawing.Image.FromStream(strm); 
            car.CarImage = img; 
           } 
          } 
          Cars.Add(car); 
         } 
        } 
      . 
      . 
      . 
      return Cars; 
    } 

最後一件事:當你點擊按鈕,列表框將顯示CarInformati (右側)和CarImage(左側)。在運行時,我檢查_databaseCarList中有CarInformations和CarImages的列表。甚至有圖像(list.CarImage)的值(字節),但爲什麼不顯示圖像?

 private void Button1_Click(object sender, SelectionChangedEventArgs e) 
    { 
     _carImageList = new CarImageExtractor(); 
     const int oneDay = 1; 
     var lstCar = new List<CarInfo>(); 

      _databaseCarList = new ObservableCollection<CarInfo>(_carImageList.GetCarImagesList(oneDay)); 

      if (_databaseCarList != null) 
      { 
       foreach (var list in _databaseCarList) 
       { 

        lstCar.Add(new CarInfo{Car = list.Car, CarImage = list.CarImage}); 
       } 

       listboxCars.ItemsSource = lstCar; 

      } 

    } 
+0

CarInfo是否實現INotifyPropertyChanged併爲CarImage屬性引發? – user2509738

回答

0

您正在使用WPF不支持的WindowsForms圖像(System.Drawing.Image)作爲圖像的ImageSource。 (在VisualStudio中調試時,您應該從ImageSourceConverter獲得綁定錯誤)

對於WPF,您需要使用BitmapImage

更改屬性CarImage爲System.Windows.Media.Imaging.BitmapImage並將圖像的初始化代碼更改爲以下內容。

strm.Write(buffer, 0, (int) size); 
strm.Position = 0; 

BitmapImage img = new BitmapImage(); 
img.BeginInit(); 
img.StreamSource= strm; 
img.EndInit(); 

car.CarImage = img; 
+0

它幾乎工作。顯示在列表框中的圖像,但這些圖像只顯示全部綠色,沒有實際圖像。爲什麼?是因爲大小還是什麼? DinnerImage的數據類型是屬性中的BitMapImage。是對的嗎? – user235973457

+0

@ user235973457你是否從db讀完整圖像?你只能從db讀取最大10000字節。你的圖像有多大,以字節爲單位? – Jehof

+0

是從數據庫完整圖像。其中一個值就像0xFFD8FFE000104A46494600010200006400640000FFEC00114475636B ......這個長度是43679 – user235973457