有没有比在XAML中使用ObservableCollection更好的快速绑定的方法?
有没有比在XAML中使用ObservableCollection更好的快速绑定的方法?
我们正在开发一个Windows Phone应用程序(CurrencyExchange),其中包括一个文本框和一个列表框。列表框的项源是它的视图模型的属性类型为ObservableCollection。文本框的文本更改事件会改变ObservableCollection的所有项,但当Observable更改并尝试绑定列表框的项时,页面会出现锁定。我看到一个名为Fastobservablecollection的自定义ObservableCollection,在视图模型中无法运行,因为它使用了DispatcherObject和Dispatcherprioty,这在视图模型中无法使用。有没有比ObservableCollection更好的替代品?
问题的出现原因:使用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更新时,我没有观察到延迟或性能问题。
好的,我会尝试修复它们,谢谢你的关注。