我試圖如這裏討論結合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')
謝謝, 埃裏克
也許你向catch塊添加一些代碼'// TODO:log exception'。 – Clemens
如果您從流中加載圖像,爲什麼不直接通過其[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
你在你的轉換器中究竟做了什麼?如果你的「Image.Image」返回一個「Stream」(字節數組),那麼你不需要任何轉換器,你可以直接將它綁定到ImageSource。如果您使用的是轉換器,則該轉換器應返回「BitmapImage」。 – Bathineni