2012-10-19 56 views
1

我試圖如這裏討論結合Image.Source在一個DataTemplate到System.Drawing.Image對象:using XAML to bind to a System.Drawing.Image into a System.Windows.Image control綁定圖片轉換爲System.Drawing.Image

<UserControl.Resources> 
    <media:ImageConverter x:Key="imageConverter" /> 
    <DataTemplate DataType="{x:Type data:GameTile}" > 
     <StackPanel Orientation="Vertical" Margin="5" Background="Transparent"> 
      <Viewbox> 
       <TextBlock FontWeight="Bold" Text="{Binding PointValue}" TextAlignment="Center" FontSize="14" /> 
      </Viewbox> 
      <Image Margin="0,5,0,0" Source="{Binding Path=Image.Image, Converter={StaticResource imageConverter}}" /> 
     </StackPanel> 
    </DataTemplate> 
</UserControl.Resources> 
    <Grid> 
     <loop:ListBox x:Name="listBox1" 
         ItemsSource="{Binding Path=GameModel.Game.GameTiles}" 
         ItemContainerStyle="{StaticResource GameTileContainerStyle}" Orientation="Vertical" /> 
    </Grid> 

的GameTile對象具有圖像(而不是system.drawing.image)屬性,該屬性指向具有類型System.Drawing.Image的Image屬性的Picture對象。 我將ListBox上的ItemsSource綁定到Game對象上的GameTiles集合。

對象

public class Game 
{ 
    public XPCollection<GameTile> GameTiles 
    { 
     get { return GetCollection<GameTile>("GameTiles"); } 
    } 
} 

public class GameTiles 
{ 
    Picture fImage; 
    public Picture Image 
    { 
     get { return fImage; } 
     set { SetPropertyValue<Picture>("Image", ref fImage, value); } 
    } 
} 

public class Picture 
{ 

    private FileData fFile; 
    public FileData File 
    { 
     get { return fFile; } 
     set 
     { 
      SetPropertyValue("File", ref fFile, value); 
      if (string.IsNullOrEmpty(fName)) 
      { 
       fName = (value == null ? string.Empty : value.FileName); 
      } 
      fImage = null; 
     } 
    } 

    Image fImage; 
    public System.Drawing.Image Image 
    { 
     get 
     { 
      if (fImage == null) 
      { 
       try 
       { 
        MemoryStream stream = new MemoryStream(); 
        fFile.SaveToStream(stream); 
        stream.Position = 0; 
        fImage = Image.FromStream(stream); 
       } 
       catch 
       { 
        //TODO: log exception 
       } 
      } 
      return fImage; 
     } 
     //set { SetPropertyValue<Image>("Image", ref fImage, value); } 
    } 
} 

的圖像不被顯示在ListBoxItems起來,而是我綁定到的DataTemplate任何其他屬性將顯示出來。值得注意的是,我使用Devexpress Xpo作爲ORM。上面表示的類也實現了INotifyPropertyChanged。 關於我可能錯過的任何想法?

編輯:忘了提及,我已經實現了一個值轉換器,如我在上面鏈接的帖子中提到的。但是,如果我在轉換器方法中放置斷點,它將永遠不會被調用。

編輯:將fFile屬性添加到上面的代碼。 我可以設置一個Image.Source通過c#(通過將​​其轉換爲BitmapImage)GameTile.Image.Image屬性,並讓它按預期工作,但我不知道如何通過c#實現與DataTemplate。我更喜歡在XAML中設置綁定,但是會用DataTemplate(或其他可行的方法)解決c#的解決方法。我非常有信心,問題不在於GameTile.Image屬性從數據庫中拉取圖像,因爲如果我手動設置了C#中Image.Source的源代碼,圖像就在那裏。它根本不在DataTemplate中工作。

編輯:確定問題與不直接在DataType上的屬性有關,例如與GameTile具有(int)PointValue屬性,(圖片對象)圖像屬性和(獎品)獎品。

如果我綁定到

<TextBlock Text="{Binding PointValue}" /> 

它按預期工作。 但是,如果我綁定到

<TextBlock Text="{Binding Prize.Name}" /> 

這是行不通的。 如果我綁定到

<Image Margin="0,5,0,0" Source="{Binding Image.BitmapImage}" /> 

它也失敗。下圖顯示了綁定正在拋出的錯誤。

BindingExpression path error: 'Name' property not found on 'object' ''XPCollection' (Hash=...)'. BindingExpression:Path=Prize.Name; DataItem=GameTile' (HashCode=...); target element is 'TextBlock'(Name=''); target property is 'Text' (type 'String')

enter image description here

謝謝, 埃裏克

+0

也許你向catch塊添加一些代碼'// TODO:log exception'。 – Clemens

+1

如果您從流中加載圖像,爲什麼不直接通過其[StreamSource]加載BitmapImage(http://msdn.microsoft.com/zh-cn/library/system.windows.media.imaging.bitmapimage .streamsource.aspx)屬性?您可以將「Image」屬性的類型更改爲[ImageSource](http://msdn.microsoft.com/en-us/library/system.windows.media.imagesource.aspx),並且不需要任何轉換器。 – Clemens

+0

你在你的轉換器中究竟做了什麼?如果你的「Image.Image」返回一個「Stream」(字節數組),那麼你不需要任何轉換器,你可以直接將它綁定到ImageSource。如果您使用的是轉換器,則該轉換器應返回「BitmapImage」。 – Bathineni

回答

1

找到了解決辦法。 不得不改變這一點:

<TextBlock Text="{Binding Prize.Name}" /> 

這樣:(!)

<TextBlock Text="{Binding Prize!.Name}" /> 

唯一的區別是感嘆號。 這也適用於圖像屬性。

<Image Margin="0,5,0,0" Source="{Binding Path=Image!.Image, Converter={StaticResource imageConverter}}" /> 
相關問題