属性不可观察时绑定

时间:2014-02-14 19:50:23

标签: c# wpf mvvm

当对象的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

2 个答案:

答案 0 :(得分:2)

正如您所提到的,您可以使用ObservableCollection。您还可以使用BindingList

如果您不想采用这种方式,我看到的另一个选项是Band实施INotifyPropertyChanged,然后使用您的PropertyChanged属性{{}调用Members 1}}。这将告诉消费控件列表已更新并刷新自己。

与该路线相关的问题是,尝试计算何时调用name事件可能比仅将集合更改为PropertyChangedObservableCollection<T>更痛苦。< / p>

最后一个选项是每次您认为它更改时重新绑定集合,或者如果控件支持它,请调用可用的BindingList<T>方法。某处某处必须告诉控件该集合已更改,因为它们不会定期检查。

因为您将其标记为MVVM,所以您的View应该具有Refresh和ObservableCollection BandViewModel s。 ViewModel中的所有内容都应该是可绑定的,并在发生更改时发送通知。

答案 1 :(得分:0)

您的编辑使问题更加混乱。回答为什么要使用ObservableCollection。

当您希望UI观察此集合时,您应该使用ObservableCollection。我的意思是,当你期望修改这个集合时(不是在谈论这个集合中的项目,而是整个集合)。如果您希望添加/删除/排序/过滤此集合...如果没有预期的这些操作,那么您也可以绑定到IEnumerable!

另请注意,基础项中的属性被修改与您如何将集合绑定为(IEnumerable或Observable)无关。如果基础类型引发适当的通知更改事件(并实现INotifyPropertyChanged),则反映(或不反映)基础项属性的更新。

希望有所帮助!