c# – 属性不可观察时绑定

当一个对象的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中的所有内容都应该是可绑定的,并在发生更改时发送通知.

点赞