gpt4 book ai didi

xaml - 有没有比在 XAML 中使用 ObservableCollection 进行快速绑定(bind)更好的方法?

转载 作者:行者123 更新时间:2023-12-03 10:16:15 24 4
gpt4 key购买 nike

我们正在开发一个 Windows Phone 应用程序 (CurrencyExchange),并且有一个包含文本框和列表框的页面。 ListBox 的 itemsource 是它的 viewmodel 的可观察集合的属性类型。文本框的 textchange 事件正在更改可观察集合的所有项目,但是当可观察更改并尝试绑定(bind)列表框的项目时,页面被锁定。我看到了一个名为 Fastobservablecollection 的自定义可观察集合,它没有在 viewmodel 中运行,因为它使用了不能在 viewmodel 中使用的 DispatcherObject 和 Dispatcherprioty。有没有比 ObservableCollection 更好的选择?

List<Currency> newList = new List<Currency>(CurrencyConversions.ToList());
foreach (var item in newList)
{
Double result;
if (Double.TryParse(AmountPhone, 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;
}
CurrencyConversions = new ObservableCollection<Currency>(newList);

或者

 List<Currency> newList = new List<Currency>();
foreach (var item in CurrencyConversions)
{
Double result;
if (Double.TryParse(AmountPhone, 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;
newList.Add(item);
}
CurrencyConversions = new ObservableCollection<Currency>(newList);

谢谢。

使用 SmartCollection

List<Currency> newList = new List<Currency>(CurrencyConversions.ToList());
foreach (var item in newList)
{
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;
}
CurrencyConversions = new SmartCollection<Currency>(newList);

最佳答案

你不应该创建一个新的 SmartCollection每次,但更多只使用一个实例并对集合进行修改。我建议更改您的属性的实现 CurrencyConversions到以下。

private SmartCollection<Currency> _conversions;
public SmartCollection<Currency> CurrencyConversions{
get{
if (_conversions == null) {
_conversions = new SmartCollection<Currency>();
}

return _conversions;
}
}

然后你可以在你的代码中这样调用它:
CurrencyConversions.Reset(newList);

据我目前了解您的代码,您不会更改(添加和删除项目)集合,而是更改属性 CalculatedValue Currency 类型的.当类型 Currency实现接口(interface) 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"));
}
}
}

关于xaml - 有没有比在 XAML 中使用 ObservableCollection 进行快速绑定(bind)更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20370352/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com