2017-02-27 43 views
1

为了值说明字段我的问题,比方说,我在我的ViewModel其中有我的模型定义我喜欢的类型项目的几个要素一个ObservableCollection。这些商品与其他商店中的商品一样都有名称和价格,并且都在我的一个观点中列出。如何添加dinamically更改绑定变量

我的问题是,如果有任何的方式来创建变量来改变,例如,每个项目的价格动态。我想要做的是:对于我的listView中的每个元素,都有一个或多个条目来允许我定制他的特征。假设用户在其中一个条目中输入值2,与该列表视图对应的项目的价格应该高2倍,但其他条目的价格必须保持不变。

为了使一个实际的例子,考虑下面的图像。假设第一行是产品的名称,第二行是价格,我希望在每行中至少有一个条目允许我自定义价格的价值。可能吗?

Article List

回答

0

您可以创建绑定到Label.Text一个新的属性,并更新当属性绑定到Entry.Text属性更改。

+0

感谢您的回答!这的确是我的目标,但它是否适用于列表视图中的每个元素?我的listview将从我的viewModel中填入Item对象,并且我将无法使用每个Item的价格输入每个标签......我担心,如果我一旦更改了条目,就会更新所有其他商品的价格。 – FCouto

+0

只要每个项目的ViewModel具有自己的“乘数”属性,它就不应该影响其他行。 –

+0

谢谢你的帮助! – FCouto

0

是, 您可以将条目添加到您的ViewCell,并绑定入世绑定到标签相同的属性。当您更改条目中的值时,标签中的值应该更改。

+0

我明白你在说什么,但这样我会写的确切值更改标签的价值,让我们说我想要的价值300,我会写在入口300。我不想那样。我希望在标签中包含值150,并在条目中键入2以使其为300。在这种情况下,我不能将它绑定到同一个属性。我希望我这次明确表达自己。哦,这个条目必须添加到列表视图中的每个元素,因为我想为不同的产品添加不同的值... – FCouto

0

可能最简单的方法是将每个Item包装在ItemViewModel中。

ItemViewModel有一个公共财产Multiplier其中 - 在二传手 - 包含Item的价格将被更新。

对于价格的变化将反映在视图 - 它必须实现INotifyPropertyChanged,当然,当“价格”设置引发该事件。

或者:在构造函数从Item复制PriceItemViewModel到另外Price财产上的ItemViewModel

随着示例代码你需要的IValueConverter到输入文本从string转换为double(或使用允许结合double的apropriate控制)

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; } 

}