C# ObservableCollection和multiply NotifyProperty已更改

C# ObservableCollection和multiply NotifyProperty已更改,c#,wpf,class,observablecollection,inotifypropertychanged,C#,Wpf,Class,Observablecollection,Inotifypropertychanged,我在可观察收集方面有一些问题 基本上问题是,我需要改变很多属性,取决于,改变了什么 例如: 下面您可以看到ProductCount方法,它更改ListView上所选产品的计数(数量)(ListView具有ObservableCollection绑定) 因此,当我更改ProductCount时,我还需要更改折扣价格(当产品有折扣时)、ProductPrice(即Count*Price)、折扣值(例如,如果项目有50%的折扣,则重新计算), ReceiptSum(这是所有产品价格*产品数量的总和),

我在可观察收集方面有一些问题

基本上问题是,我需要改变很多属性,取决于,改变了什么

例如:

下面您可以看到ProductCount方法,它更改ListView上所选产品的计数(数量)(ListView具有ObservableCollection绑定)

因此,当我更改ProductCount时,我还需要更改折扣价格(当产品有折扣时)、ProductPrice(即Count*Price)、折扣值(例如,如果项目有50%的折扣,则重新计算), ReceiptSum(这是所有产品价格*产品数量的总和),以及物品是否被送到厨房的背景

public decimal ProductCount
{
    get 
    {
        //get count from database
        return _productCount;
    }
    set
    {
        _productCount = value;
        //update count in database
        NotifyPropertyChanged("ProductCount");
        NotifyPropertyChanged("DiscountPrice");
        NotifyPropertyChanged("ProductPrice");
        NotifyPropertyChanged("DiscountValue");
        NotifyPropertyChanged("TotalValue");
        NotifyPropertyChanged("ReceiptSum);
        NotifyPropertyChanged("SentToKichen");
    }
}
嗯,一切似乎都很好,但是。问题是,这花了很多时间来改变一切。例如,在我的8核PC、16GB RAM上,更改某些值需要4秒钟。此时应用程序被冻结, 这是我想解决的问题

也许你知道我该如何更改源代码,以便更快地重新计算所有值吗


提前谢谢

我建议您使用异步方法。它将在UI线程中执行异步调用,所以应用程序不应该冻结。请注意,只有当您不需要即时通知时,此解决方案才是好的。 如果ProductCount在继承DependencyObject的类中,请使用Dispatcher,否则可以使用Deployment.Current.Dispatcher

public decimal ProductCount
{
    get 
    {
        //get count from database
        return _productCount;
    }
    set
    {
        _productCount = value;
        //update count in database
        Dispatcher.BeginInvoke(new Action(() => 
        {
            NotifyPropertyChanged("ProductCount");
            NotifyPropertyChanged("DiscountPrice");
            NotifyPropertyChanged("ProductPrice");
            NotifyPropertyChanged("DiscountValue");
            NotifyPropertyChanged("TotalValue");
            NotifyPropertyChanged("ReceiptSum);
            NotifyPropertyChanged("SentToKichen");
        }
    }
}

查看代码中的注释,我会怀疑问题的最大原因是每次读取属性时,您都是从数据库中获取它。这意味着,如果您有n个属性,并且您正在显示m条记录,那么当UI要对所有属性进行数据绑定时,您正在进行n x m个数据库调用,这肯定不能很好地扩展


更好的方法是一次性请求数据,根据结果构建视图模型。当您需要刷新数据时(如产品计数更改),然后对数据库进行一次性刷新并更新各种属性-这反过来会引发各种属性更改事件。

您可以在backgroundworker中运行必须进行的每项更改,以加快处理速度


最好在viewModel中完成工作,更新视图,然后更新模型

更改该值并标记这些属性可能不会导致问题。您同时还做了什么?不确定,但问题可能是,当我更新数据库时,我得到的是ProductID(类),而不是ProductID(私有值)。也许这就是问题所在?我在每个get上都添加了Console.Writeline,我只需将产品添加到listview就可以收到176条消息。我猜您的数据访问是瓶颈。尝试计时查询/更新well,这是一个很好的解决方案,但不幸的是,我需要即时通知。