【问题标题】:Xamarin Listview binding to ObservableCollection of normal classXamarin Listview 绑定到普通类的 ObservableCollection
【发布时间】:2016-12-11 01:44:35
【问题描述】:

我得到了一个Book 类,它没有实现INotifyPropertyChanged 接口,我无法更改它。我有一个 Book 的集合,我想在 Xamarin 中的 ListView 中显示它们。所以:

public class BookListViewModel : INotifyPropertyChanged
{
    public ObservableCollection<Book> Books { get; set; }

    private void TestAction()
    {
        Books[1].Name = "New Name";
        //Here I need to inform the list to refresh
    }
}

现在我将这个Books 绑定到我的ListView.ItemsSource。如何通知ListView 刷新?我尝试将OnPropertyChanged("Books"); 放在评论所在的位置,但不是运气。

【问题讨论】:

    标签: c# xamarin xamarin.forms


    【解决方案1】:

    当您尝试OnPropertyChanged("Books"); 时,它用于通知列表元素的数量已更改,而不是元素本身。

    由于您无法在模型级别实现INotifyPropertyChanged,因此在您修改列表中的单元格时,诀窍是:

    1. 删除要修改的元素
    2. 致电OnPropertyChanged("Books"); 以便刷新列表
    3. 使用新数据添加要修改的元素
    4. 调用OnPropertyChanged("Books"); 以便更新列表并更新单元格。

    正如您可能猜到的那样,这种解决方案可能会解决您的问题,但性能方面很差,因为您的视图列表必须重绘两次。因此,如果 Book 类经常更改,那么我会说您必须对其进行更改以使其实现 INotifyPropertyChanged

    或者您可能有一个实现INotifyPropertyChangedBook 类的中间副本,并有一个 Book 的实例,您可以从 riplica 类中引用它的属性。 顺便说一下,如果你有很多类要处理,你可以使用 Automapper 来帮助你

    【讨论】:

    • 感谢您的回复。它会起作用,但不是专业的事情。更好的解决方案是拥有实现INotifyPropertyChangedBook 的副本并使用AutoMapper 或类似的转换类型,但这些是解决方法。如果可用,我需要强大的解决方案。
    • 是的,这也可以,但我认为这可能是一个漫长的过程,但后来你提到了 AutoMapper。所以如果你认为这是一个正确的答案,请标记它,以便其他人也能找到它:)
    猜你喜欢
    • 2018-10-03
    • 2018-01-21
    • 1970-01-01
    • 2012-05-26
    • 2018-05-21
    • 2014-01-14
    • 2017-09-29
    相关资源
    最近更新 更多