【发布时间】:2012-03-17 03:56:33
【问题描述】:
我试图直观地显示一个项目(在我的例子中是 BitmapImage)已使用 WPF/MVVM 添加到 ListBox 中的集合中。为了提供一些背景知识,我正在使用采集卡捕获流式视频,并且在视频流式传输时拍摄静止图像。这些图像是通过单击 UI 上的“静止图像”按钮捕获的。捕获图像后,我想在 UI 上的单独面板中显示所述图像的缩略图。我知道需要做什么才能做到这一点,但我似乎无法让它发挥作用。现在,我的模型完成所有数据检索。
public ObservableCollection<BitmapImage> GetAssetThumbnails()
{
var imageDir = ImgPath != null ? new DirectoryInfo(ImgPath) : null;
if(imageDir != null)
{
try
{
foreach (FileInfo imageFile in imageDir.GetFiles("*.jpg"))
{
var uri = new Uri(imageFile.FullName);
_assetThumbnails.Add(new BitmapImage(uri));
}
}
catch (Exception)
{
return null;
}
}
return _assetThumbnails;
}
我的 ViewModel 在其构造函数中创建模型的新实例,然后将公共属性 AssetCollection 设置为等于 _assetModel.GetAssetThumbnails()。 ViewModel 具有所有标准的 OnPropertyChanged 事件和事件处理。
private void OnPropertyChanged(string propertyName)
{
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
#region Public Properties
public ObservableCollection<BitmapImage> AssetCollection
{
get { return _assetCollection; }
set
{
if (_assetCollection != value)
{
_assetCollection = value;
OnPropertyChanged("AssetCollection");
}
}
}
#endregion
private void _assetCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
OnPropertyChanged("AssetCollection");
}
public event PropertyChangedEventHandler PropertyChanged;
然后,在我的 XAML 文件中,我将 ListBox 的项目源绑定到 AssetCollection。
<ListBox x:Name="lstBoxAssets" ItemsSource="{Binding AssetCollection}" Grid.Row="1" Background="{DynamicResource GrayColor}" Margin="5,0,0,5" ></ListBox>
我读到集合中的每个项目都应该实现 INotifyPropertyChanged 接口。我尝试为实现它的位图图像创建一个包装器类,但它也不起作用。有什么我在这里想念的吗?图像最初会显示,但在捕获并保存图像后不会刷新。我有一种感觉,它源于事件PropertyChanged 没有被调用。我通过调试注意到它在检查时始终为空,因此永远不会调用 OnPropetyChanged 方法。我不确定我应该在哪里添加这个事件处理程序。我只使用代码隐藏文件将视图模型的数据上下文添加到视图中,仅此而已。这就是我通常认为添加任何事件处理的地方。谁能看到我在这里遗漏的一些简单的东西?
【问题讨论】:
-
尝试“我尝试为实现该功能的位图图像创建一个包装器类,但它也不起作用。”再次。对项目的更改需要通过 NotifyPropertyChanged 来自项目。您使用公共财产吗?
-
是的,该属性是公开的。我将尝试再次创建一个包装类。上次我可能错过了什么。
标签: wpf mvvm listbox observablecollection