【发布时间】:2016-01-09 16:45:19
【问题描述】:
在 MVVM 中使用 WPF。我有一个带有 CurrentItem 属性的 ViewModel。这是一个直接从实体框架中提取的 Item 对象。 Item 有一个 Property 对象的集合。
public virtual ICollection<Property> Properties { get; set; }
在视图中,我需要用户能够在此集合中添加和删除对象。为此,我需要创建一个 ObservableCollection<Property>,我们将其称为 ItemProperties。
有多种方法可以做到这一点。最明显的是在 ViewModel 上添加 ObservableCollection<Property> 属性。然后在构造函数中填充它,如下所示:
ItemProperties = new ObservableCollection<Property>(CurrentItem.Properties);
还可以创建一个位于真实集合顶部的 ObservableCollection 包装器:
public ObservableCollection<Property> ItemProperties
{
get
{
return new ObservableCollection<Property>(CurrentItem.Properties);
}
set
{
CurrentItem.Properties = value.ToList();
OnPropertyChanged("ItemProperties");
}
}
这有它自己的问题。你不能只 Add() 到这个集合,因为它会首先 get,这意味着集合保持不变。因此,您要么必须启动一个新集合,添加到该集合,然后将其值分配给该属性,要么在该属性之外引发 OnPropertyChanged 事件。其中任何一个听起来都像是维护问题。
有没有更有效的方法可以直接访问 EF 属性列表?
【问题讨论】:
-
如果您希望用户能够添加和删除,您可能不想使用可观察集合。
-
@Chris 如果我想使用双向绑定以便视图响应用户的操作,我的印象是 ObservableCollection 是必要的?快速测试表明情况确实如此。
-
为了让视图响应,您需要实现可观察集合默认执行的 INotifyPropertyChanged,如果您沿着这条路线走,则需要自定义控件,但它会更适合您的需求
标签: c# wpf entity-framework mvvm