当对象的list属性不可观察时,是否有最佳实践方法来绑定它?例如,如果我们有:
public class Band
{
public string Name { get; set; }
public List<Musician> Members { get; private set; }
// other properties here
}
如果我的视图模型具有Band
属性,并且我希望我的UI绑定到Members
属性,那么UI上显示的Members
属性的更新如何?成员是不可观察的。
目前的想法是创建一个DTO,它是Band
类的精确副本,但将Members
设为ObservableCollection
。然后UI将绑定到此DTO。在视图模型关闭之前,它会将DTO映射回适当的Band
类。这似乎有点开销。还有更好的方法吗?
修改 - 另一个选项
我刚与某人讨论过此事。我们的想法是在视图模型上添加ObservableCollection
属性。然后,在视图模型的构造函数中,使用实体填充ObservableCollection
。用户完成编辑后,使用更新后的ObservableCollection
重置实体上的List
。
答案 0 :(得分:2)
正如您所提到的,您可以使用ObservableCollection
。您还可以使用BindingList
。
如果您不想采用这种方式,我看到的另一个选项是Band
实施INotifyPropertyChanged
,然后使用您的PropertyChanged
属性{{}调用Members
1}}。这将告诉消费控件列表已更新并刷新自己。
与该路线相关的问题是,尝试计算何时调用name
事件可能比仅将集合更改为PropertyChanged
或ObservableCollection<T>
更痛苦。< / p>
最后一个选项是每次您认为它更改时重新绑定集合,或者如果控件支持它,请调用可用的BindingList<T>
方法。某处某处必须告诉控件该集合已更改,因为它们不会定期检查。
因为您将其标记为MVVM,所以您的View应该具有Refresh
和ObservableCollection BandViewModel
s。 ViewModel中的所有内容都应该是可绑定的,并在发生更改时发送通知。
答案 1 :(得分:0)
您的编辑使问题更加混乱。回答为什么要使用ObservableCollection。
当您希望UI观察此集合时,您应该使用ObservableCollection。我的意思是,当你期望修改这个集合时(不是在谈论这个集合中的项目,而是整个集合)。如果您希望添加/删除/排序/过滤此集合...如果没有预期的这些操作,那么您也可以绑定到IEnumerable!
另请注意,基础项中的属性被修改与您如何将集合绑定为(IEnumerable或Observable)无关。如果基础类型引发适当的通知更改事件(并实现INotifyPropertyChanged),则反映(或不反映)基础项属性的更新。
希望有所帮助!