ここで説明したように、DataTemplate の Image.Source を System.Drawing.Image にバインドしようとしています: XAML を使用して System.Drawing.Image を System.Windows.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 タイプの Image プロパティを持つ Picture オブジェクトを指す Image (system.drawing.image ではない) プロパティがあります。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 (または他の機能するもの) を使用した ac# の回避策で解決します。c# で Image.Source にソースを手動で設定すると、画像がそこにあるため、GameTile.Image プロパティがデータベースから画像を取得することに問題はないと確信しています。DataTemplate では機能していません。
編集: たとえば、バインドしている DataType に直接存在しないプロパティに関連する問題を特定し、GameTile には (int)PointValue プロパティ、(Picture オブジェクト)Image プロパティ、および (Prize オブジェクト)Prize があります。財産。
私がバインドする場合
<TextBlock Text="{Binding PointValue}" />
期待どおりに動作します。しかし、私がバインドする場合
<TextBlock Text="{Binding Prize.Name}" />
それは動作しません。そして私がバインドする場合
<Image Margin="0,5,0,0" Source="{Binding Image.BitmapImage}" />
それも失敗します。次の図は、バインディングによってスローされるエラーを示しています。
BindingExpression パス エラー: 'オブジェクト' ''XPCollection' (ハッシュ =...)' に 'Name' プロパティが見つかりません。BindingExpression:Path=Prize.Name; DataItem=GameTile' (HashCode=...); ターゲット要素は 'TextBlock'(Name=''); ターゲット プロパティは 'Text' (タイプ 'String') です
ありがとう、エリック