我有一个带有ListBox的表单包含许多项目。每个项目都应该有标题和图像。这是我的XAML:
<ListBox x:Name="MyList" HorizontalAlignment="Left" Height="384" Margin="10,505,0,0" VerticalAlignment="Top" Width="366"
ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<!--This works:-->
<Label Content="{Binding Title}"/>
<!--This doesn't:-->
<Image Width="50" Height="50" Source="{Binding Cover}" Stretch="UniformToFill"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我的数据类看起来像这样:
class Data
{
public BitmapImage Cover{ get; set; }
public string Title{ get; set; }
}
我从这样的BitmapImage
获得了Bitmap
:
Data data;//this is my data object
Bitmap bitmap;//this is my bitmap. It holds a valid image, I've checked.
MemoryStream memory = new MemoryStream();
bitmap.Save(memory, ImageFormat.Bmp);
memory.Position = 0;
data.Cover = new BitmapImage();
data.Cover.BeginInit();
data.Cover.StreamSource = memory;
data.Cover.CacheOption = BitmapCacheOption.OnLoad;
data.Cover.EndInit();
最后,我设置列表的数据如下:
MyList.ItemsSource = dataList;//dataList is a List<Data>
将标题(或其他简单属性,如日期或int
属性)绑定到Label可以正常工作,但图像不会显示。如何正确显示?
答案 0 :(得分:2)
因此,Cover
类中的Data
属性需要引发属性更改事件,以使视图知道它需要在更改时再次获取图像。要做到这一点很简单:
class Data, INotifyPropertyChanged
{
private BitmapImage _cover;
public BitmapImage Cover
{
get { return _cover; }
set
{
_cover = value;
OnPropertyChanged("Cover");
}
}
public string Title{ get; set; }
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
答案 1 :(得分:0)
您的Cover init代码在我的项目中运行正常。 我想你忘了发布以下内容: dataList.Add(数据); 我不知道你为什么两次设置ItemsSource属性。如果您使用MVVM并绑定ItemsSource属性,则不应从代码中设置该属性(MyList.ItemsSource = dataList;) 相反,我会在XAML中建议ItemsSource =“{Binding} dataList”。