C# Xamarin ListView ObservableCollection未更新

C# Xamarin ListView ObservableCollection未更新,c#,xamarin,data-binding,C#,Xamarin,Data Binding,我正在尝试用mvvm xamarin做一个项目 我有一个listview(以observablecollection为边界),在listview内部有一个按钮。单击此按钮,我在Observable集合中进行了一些更新。但是,直到我删除并再次插入可观察的集合,更新才会生效 这是密码 <ListView ItemsSource="{Binding SalesList,Mode=TwoWay}"> <ListView.ItemTemplate>

我正在尝试用mvvm xamarin做一个项目

我有一个listview(以observablecollection为边界),在listview内部有一个按钮。单击此按钮,我在Observable集合中进行了一些更新。但是,直到我删除并再次插入可观察的集合,更新才会生效

这是密码


 <ListView ItemsSource="{Binding SalesList,Mode=TwoWay}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell IsEnabled="True"    >

                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>


                            <Label FontSize="Large" Text="{Binding StockTotal}"/>

                            <Button Text="+"     Grid.Column="1"  CommandParameter="{Binding .}"   Command="{Binding Path=BindingContext.ADDOPERATION,    Source={x:Reference Mypage}}"  />

                            <Entry Text="{Binding StockAmount}"  Grid.Column="2" />

                        </Grid> 
                    </ViewCell>
                </DataTemplate>  
            </ListView.ItemTemplate> 
        </ListView>

    <Label Text="{Binding SUMMARY}"/>

我不知道为什么会发生这个问题。 ADDOPERATION命令工作顺利(我在debuge模式下检查了它),但它没有更新listview。 当我将此代码添加到下面时,列表视图将更新。但是我想我遗漏了一些东西,因为当我在ObservableCollection中进行更改时,它会自动影响UI。只有在删除并再次插入相同的数据后,我才能执行此操作

            SalesList.RemoveAt(index);

            SalesList.Insert(index, cominginfo); 

INotifyPropertyChanged事件的BaseViewModel类

  public class BaseViewModel : INotifyPropertyChanged
    { 
        public event PropertyChangedEventHandler PropertyChanged;
        protected void INotifyPropertyChanged([CallerMemberName] string propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

我的模范班

 public class SalesModel:BaseViewModel
    {

        public double StockTotal { get; set; } 
        public string StockName { get; set; }
        public double StockAmount { get; set; }
    }

提前感谢

您需要在setters上调用
PropertyChanged
,以便通知UI值已更改

private double stockTotal;
public double StockTotal 
{ 
  get
  {
    return stockTotal;
  }
  set 
  {
     stockTotal = value;
     PropertyChanged("StockTotal");
  }
}

SalesModel
需要实现INotifyPropertyChanged。ObservableCollection仅处理集合的添加和更改,而不处理集合中项目属性的更改。请参阅此帖子,在“简历”中:ObservableCollection仅在添加、删除、移动项目时通知,而不在项目更改时通知,因此,您需要对集合属性实施属性更改。您也可以将ItemSource设置为null,然后再返回到新值,但这并不理想。请编辑您的问题以包含任何相关代码,而不是将其填充到注释SalesModel继承BaseViewModel吗?有效。谢谢你,先生。我刚刚有了这个想法。最好的问候。顺便说一句,它只适用于一处房产。如果我添加PropertyChanged(“StockAmount”);它不起作用。应用程序崩溃。您是否为该属性添加了支持字段?如果它崩溃了,你做错了。现在没事了,谢谢你,先生。另一方面,我无法得到特定列的和。摘要属性不会更新,尽管ObservableCollection已更新。我更新了codeSUMMARY,它不是真实的属性,而是计算出来的。因此,每当设置StockTotal时,您应该提高PropertyChanged(“Summary”)。
private double stockTotal;
public double StockTotal 
{ 
  get
  {
    return stockTotal;
  }
  set 
  {
     stockTotal = value;
     PropertyChanged("StockTotal");
  }
}