当一个对象的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.
最佳答案 如您所述,您可以使用ObservableCollection.您还可以使用BindingList.
如果你不想走那条路,我看到的另一个选择是让Band实现INotifyPropertyChanged然后用你的Members属性名调用PropertyChanged.这将告诉消费控件列表已更新并刷新自己.
与该路线一致的问题是,尝试计算何时调用PropertyChanged事件可能比仅仅将集合更改为ObservableCollection< T>更痛苦.或BindingList< T>.
最后一个选项是每次认为它更改时重新绑定集合,或者如果控件支持它,请调用可用的Refresh方法.某处某处必须告诉控件该集合已更改,因为它们不会定期检查.
因为您将其标记为MVVM,所以您的View应该具有BandViewModel和MemberViewModel的ObservableCollection. ViewModel中的所有内容都应该是可绑定的,并在发生更改时发送通知.