C# 编辑列表中的行<;模型>;并刷新列表视图

C# 编辑列表中的行<;模型>;并刷新列表视图,c#,.net,xamarin,xamarin.forms,C#,.net,Xamarin,Xamarin.forms,我有一个模型如下: public class Customers { public int CustomerId {get; set;} public string CustomerName {get; set;} public decimal Sales {get; set;} } public List<Customers> CustomerList { get => _customerList; set { i

我有一个模型如下:

public class Customers
{
    public int CustomerId {get; set;}
    public string CustomerName {get; set;}
    public decimal Sales {get; set;}
}
public List<Customers> CustomerList
{
   get => _customerList;

   set 
   {
       if (_customerList != value)
       {
           _customerList == value;
           OnPropertyChanged;
       } 
   }
}
Customers customer = new Customers();
customer.Id = "499";
customer.Name = "Sample Customer";
customer.Sale = 2000;

List<Customers> list = new List<Customers>();
list.items.Add(customer);
在视图模型中,我有如下属性:

public class Customers
{
    public int CustomerId {get; set;}
    public string CustomerName {get; set;}
    public decimal Sales {get; set;}
}
public List<Customers> CustomerList
{
   get => _customerList;

   set 
   {
       if (_customerList != value)
       {
           _customerList == value;
           OnPropertyChanged;
       } 
   }
}
Customers customer = new Customers();
customer.Id = "499";
customer.Name = "Sample Customer";
customer.Sale = 2000;

List<Customers> list = new List<Customers>();
list.items.Add(customer);
公共列表客户列表
{
获取=>\u客户列表;
设置
{
如果(_customerList!=值)
{
_customerList==值;
不动产变更;
} 
}
}
在Customer.Xaml中,我有一个包含网格的ListView。此ListView具有与上述CustomerList属性的绑定

我有两个问题:

在同一个Xaml中,我有一个包含入口控件的弹出代码。当我单击Save按钮时,ViewModel中会触发一个方法,该方法必须在Customers模型中添加一个项目并刷新网格

其次,如果列表中已经存在特定的CustomerId,我必须更新模型中的销售数据

我尝试了ViewModel保存方法,如下所示:

public class Customers
{
    public int CustomerId {get; set;}
    public string CustomerName {get; set;}
    public decimal Sales {get; set;}
}
public List<Customers> CustomerList
{
   get => _customerList;

   set 
   {
       if (_customerList != value)
       {
           _customerList == value;
           OnPropertyChanged;
       } 
   }
}
Customers customer = new Customers();
customer.Id = "499";
customer.Name = "Sample Customer";
customer.Sale = 2000;

List<Customers> list = new List<Customers>();
list.items.Add(customer);
Customers=新客户();
customer.Id=“499”;
customer.Name=“样本客户”;
客户销售额=2000;
列表=新列表();
列表。项目。添加(客户);
虽然上面的值应该来自入口控件,但是我硬编码来测试


执行此操作时,该项既不会添加到列表中,也不会刷新网格。可能是因为这是一个新实例。其次,如何编辑列表中的一行。

列表视图上的
项目资源使用
可观察集合
,不要创建新的,添加和删除条目只是为了保持绑定完整。像这样:

public class YourViewModel
{
    public ObservableCollection<Customer> CustomersList = new ObservableCollection<Customer> { get; set; }

    public void UpdateCustomers(IEnumerable<Customers> newCustomers)
    {
        CustomersList.Clear();

        foreach (var customer in newCustomers)
            CustomersList.Add(customer);
    }
}
公共类YourViewModel
{
public observeCollection CustomersList=新的observeCollection{get;set;}
public void UpdateCustomers(IEnumerable newCustomers)
{
CustomersList.Clear();
foreach(新客户中的var客户)
CustomersList.Add(客户);
}
}
在您的案例中,
ObservableCollection
将替换
列表。可以将其视为一个包含
INotifyPropertyChanged
变量实现的列表。无论何时从集合中添加或删除项目,都会通知UI并相应更新


另外,在
Customer
对象上实现
INotifyPropertyChanged
,以刷新该类型的值。我看到您已经在ViewModel上实现了
INotifyPropertyChanged
,因此我在此不再详细介绍。

列表视图上的
项目资源使用
ObservableCollection
,不要创建新项目,添加和删除项目只是为了保持绑定完整。另外,在
Customer
对象上实现INotifyPropertyChanged以刷新该对象中的值type@GeraldVersluis您能举例说明如何对ItemsSource使用ObservableCollection吗?请作为答案发布。将其更新为YouTunks的答案。在“客户”模型中,我实现了INotifyPropertyChanged。但是这个类只有属性,没有方法,所以它会抛出异常。您需要根据需要实现正确的事件和方法。您还可以查看PropertyChanged.Fody,将此样板代码从您手中拿走。只需添加ObservableCollection,网格就开始更新。即使模型没有改变。非常感谢。但既然ViewModel已经实现了INotifyPropertyChanged,为什么模型中需要它呢?没问题!INotifyPropertyChanged接口需要在您希望在UI中更新的任何模型上实现。在视图模型上实现时,它将只更新视图模型中的属性,而不更新基础对象