为了解释我的问题,让我说我的ViewModel中有一个ObservableCollection,它在我的模型中定义了我的类型Item的几个元素。任何其他商店中的这些商品都有名称和价格,并且都列在我的一个视图中。
我的问题是,是否有任何方法可以创建变量来动态改变每个项目的价格。我想要做的是:对于我的listView中的每个元素,有一个或多个条目允许我自定义他的特征。让我们说用户在其中一个条目中输入值2,对应于listView的那一行的项目的价格应该高2倍,但其他的必须保持不变。
为了使其成为一个实际的例子,请考虑以下图像。让我们说第一行是产品的名称,第二行是价格,我希望在每一行中至少有一个条目允许我自定义价格的价值。有可能吗?
答案 0 :(得分:0)
是, 您可以将Entry添加到ViewCell,并将Entry绑定到绑定到Label的相同属性。当您更改条目中的值时,标签中的值应该更改。
答案 1 :(得分:0)
您可以创建一个绑定到Label.Text的新属性,并在绑定到Entry.Text属性的属性发生更改时更新它。
答案 2 :(得分:0)
实现这一目标的最简单方法可能是将Item
包裹在ItemViewModel
中。
ItemViewModel
有一个公开财产Multiplier
,其中 - 在Setter中 - 包含Item
的价格将会更新。
要使价格变化反映在视图中 - 它必须实施INotifyPropertyChanged
,当然还要在“价格”时提升事件。已经确定了。
或者:将Price
从构建函数中的Item
复制到ItemViewModel
,再复制到Price
ItemViewModel
媒体资源
使用示例代码,您需要IValueConverter将条目文本从string
转换为double
(或使用允许绑定到double
的适当控件)
public class ItemsViewModel
{
public ObservableCollection<ItemViewModel> Items { get; set; }
public ItemsViewModel()
{
this.Items = new ObservableCollection<ItemViewModel>(getItemsFromSomewhere().Select(item => new ItemViewModel(item)));
}
}
public class ItemViewModel : INotifyPropertyChanged
{
private readonly Item item;
private double price;
private double multiplicator;
public ItemViewModel(Item item)
{
this.item = item;
this.price = item.Price;
}
public double Multiplicator {
get { return this.multiplicator; }
set {
this.multiplicator = value;
this.Price = this.item.Price * value;
}
}
public double Price {
get { return this.price; }
set {
this.price = value;
this.OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public class Item
{
public double Price { get; set; }
}