【问题标题】:ObservableCollection and multiply NotifyPropertyChangedObservableCollection 并乘以 NotifyPropertyChanged
【发布时间】:2014-01-31 09:48:58
【问题描述】:

我对 ObservableCollection 有一些问题。

基本上问题是,我需要更改很多属性取决于更改的内容。

例如:

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

因此,当我更改 ProductCount 时,我还需要更改 DiscountPrice(当产品有折扣时)、ProductPrice(即 Count * Price)、DiscountValue(例如,如果商品有 50% 的折扣,则重新计算), ReceiptSum(这是所有 ProducPrice * ProductCount 的总和),如果商品被送到厨房,则为背景。

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 秒。此时应用程序被冻结, 这是我想解决的问题。

也许您知道如何更改我的源代码以更快地重新计算所有值?

提前致谢!

【问题讨论】:

  • 更改该值并标记这些属性可能不会导致您的问题。你同时还在做什么?
  • 不确定,但问题可能是,当我更新数据库时,我获取的是 ProductID(类),而不是 _productID(私有值)。所以也许这是问题?我在每次获取时都添加了 Console.Writeline,并且只需将产品添加到列表视图,我就会收到 176 条消息。
  • 我的猜测是您的数据访问是瓶颈。尝试定时查询/更新

标签: c# wpf class observablecollection inotifypropertychanged


【解决方案1】:

我建议你使用异步Dispatcher.BeginInvoke 方法。它将在 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");
        }
    }
}

【讨论】:

  • 嗯,这是一个很好的解决方案,但不幸的是我需要即时通知。
【解决方案2】:

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

执行此操作的更好方法是一次性请求数据,根据结果构建视图模型。当您需要刷新数据时(如产品数量变化的情况),然后一键访问数据库并更新各种属性 - 这反过来会导致各种属性更改事件触发。

【讨论】:

    【解决方案3】:

    您可以在后台工作人员中运行您必须进行的所有更改以加速处理。

    最好在你的 viewModel 中做你的工作,更新 V​​iew 然后更新你的 Model

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多