Xamarin.Forms NotifyPropertyChanged 不会更新现有项目 (Android)

Posted

技术标签:

【中文标题】Xamarin.Forms NotifyPropertyChanged 不会更新现有项目 (Android)【英文标题】:Xamarin.Forms NotifyPropertyChanged does not update already existing items (Android) 【发布时间】:2020-12-12 14:39:33 【问题描述】:

我有一个这样的 ListView:

        <ListView x:Name="ItemsListView"
                ItemsSource="Binding Items"
                VerticalOptions="FillAndExpand"
                HasUnevenRows="true"
                RefreshCommand="Binding LoadItemsCommand"
                IsPullToRefreshEnabled="False"
                IsRefreshing="Binding IsBusy, Mode=OneWay"
                CachingStrategy="RecycleElement"
                ItemSelected="OnItemSelected">

我的 ViewModel 有这个定义,我的 Model 类看起来像这样:

    public ObservableCollection<IncomingJobItem> Items  get; set; 
    public class IncomingJobItem
    
        public int Index  get; set; 

        [JsonProperty("id")]
        public string Id  get; set; 

        [JsonProperty("name")]
        public string Name  get; set; 

        [JsonProperty("amount")]
        public int Amount  get; set; 
    

现在,当我更新 ViewModelObject.Items 并调用 NotifyPropertyChanged 时,ListView 中已经存在的项目不会得到更新。

例子:

// change already existing item
ViewModelObject.Items[0].Amount = 3;

// notify item in Items has changed
ViewModelObject.NotifyPropertyChanged("Items");

// nothing happens, item 0 in the list stays with the old amount...
// expected is to update the item in the list to display 3

但是当我创建新元素并将其添加到ViewModelObject.Items 时,ListView 会添加新项目但不会更新已经存在的项目。我能做什么?

同样ViewModelObject.NotifyPropertyChanged("Items.Amount"); 什么也不做。

【问题讨论】:

您需要在已更新的单个属性上调用 NotifyPropertyChanged,而不是在集合上 @Jason 我试过了,但它不起作用(NotifyPropertyChanged with Amount 和 Items.Amount 什么都不做) IncomingJobItem 没有实现 INPC。您实际上必须在类上实现接口,并从属性的设置器中调用 PropertyChanged 方法。您不能只是从某个随机类中调用它并期望它起作用。有很多很多文章解释了如何做到这一点。喜欢***.com/questions/1315621/… @Jason 不,它没有......但是非常感谢你,你的提示让我找到了解决方案。这个概念对我来说是新概念,所以请原谅我的菜鸟错误。 【参考方案1】:

感谢 cmets 中的@Jason,我得到了答案。

我的模型类没有实现INotifyPropertyChanged

实现可以这么简单:

    public class IncomingJobItem : INotifyPropertyChanged
    
        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged([CallerMemberName] string name = null)
        
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        

        public int Index  get; set; 

        [JsonProperty("id")]
        public string Id  get; set; 

        [JsonProperty("name")]
        public string Name  get; set; 

        [JsonProperty("amount")]
        public int Amount  get; set; 
    

更新可以这样进行:

incomingJobItemObj.OnPropertyChanged("Amount"); // or any other property name

【讨论】:

同样,PropertyChanged 调用应该在设置器中。虽然你正在做的事情可能会奏效,但这并不是一个好的设计。

以上是关于Xamarin.Forms NotifyPropertyChanged 不会更新现有项目 (Android)的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms 手势密码实现

Xamarin.Forms 和 Xamarin Native 有啥区别? [关闭]

如何使用 Xamarin.Forms.Maps(无 Xamarin.Forms.GoogleMaps)在地图中应用样式或更改颜色

Xamarin Forms Prism:prism ResourceDictionary 中已存在具有键“Xamarin.Forms.NavigationPage”的资源

Xamarin.Forms.Forms.Init(e) Onlaunched 中的 FileNotFoundExeception

如果调用方未使用 Xamarin.Forms,Xamarin 依赖项服务能否正常工作?