有没有比在XAML中使用ObservableCollection更好的快速绑定的方法?

10 浏览
0 Comments

有没有比在XAML中使用ObservableCollection更好的快速绑定的方法?

我们正在开发一个Windows Phone应用程序(CurrencyExchange),其中包括一个文本框和一个列表框。列表框的项源是它的视图模型的属性类型为ObservableCollection。文本框的文本更改事件会改变ObservableCollection的所有项,但当Observable更改并尝试绑定列表框的项时,页面会出现锁定。我看到一个名为Fastobservablecollection的自定义ObservableCollection,在视图模型中无法运行,因为它使用了DispatcherObject和Dispatcherprioty,这在视图模型中无法使用。有没有比ObservableCollection更好的替代品?

0
0 Comments

问题的出现原因:使用ObservableCollection进行快速绑定在XAML中的一个更好的方法是什么?

解决方法:不应每次创建新的SmartCollection实例,而是更多地使用一个实例并对集合进行修改。建议将属性CurrencyConversions的实现更改为以下内容。

private SmartCollection _conversions;
public SmartCollection CurrencyConversions{
  get{
    if (_conversions == null) {
      _conversions = new SmartCollection();
    }
    return _conversions;
  }
}

然后在代码中这样调用:

CurrencyConversions.Reset(newList);

根据我目前对你的代码的理解,你不是在更改(添加和删除项目)集合,而是更改类型Currency的属性CalculatedValue。当类型Currency实现接口INotifyPropertyChanged时,无需更改集合即可更新UI,因此将代码更改为以下内容就足够了。

foreach (var item in CurrencyConversions) {
  Double result;
  if (Double.TryParse(Amount, NumberStyles.Any, new System.Globalization.CultureInfo("tr-TR"), out result))
    item.CalculatedValue =Math.Round( result * (Direction == "0" ? item.ConversionRateSell : item.ConversionRateBuy),2);
  else
    item.CalculatedValue = 0;
}

前提是你的类型实现了INotifyPropertyChanged。为了使其工作,属性CalculatedValue应该如下所示:

private double _value;
public double CalculatedValue{
  get{
    return _value;
  }
  set{
    _value = value;
    if (PropertyChanged != null) {
      PropertyChanged(this, new PropertyChangedEventArgs("CalculatedValue"));
    }
  }
}

在foreach中出现“Collection was modified; enumeration operation may not execute.”错误。

我已将foreach更改为for,但与旧的速度相同。

ğrulEmreAtalay,我认为你的代码有问题,并且在你的问题中缺少一些相关信息。使用ObservableCollection和UI更新时,我没有观察到延迟或性能问题。

好的,我会尝试修复它们,谢谢你的关注。

0