如何添加以二进制方式更改绑定变量值的字段

时间:2017-02-27 12:59:24

标签: xaml xamarin xamarin.forms

为了解释我的问题,让我说我的ViewModel中有一个ObservableCollection,它在我的模型中定义了我的类型Item的几个元素。任何其他商店中的这些商品都有名称和价格,并且都列在我的一个视图中。

我的问题是,是否有任何方法可以创建变量来动态改变每个项目的价格。我想要做的是:对于我的listView中的每个元素,有一个或多个条目允许我自定义他的特征。让我们说用户在其中一个条目中输入值2,对应于listView的那一行的项目的价格应该高2倍,但其他的必须保持不变。

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

Article List

3 个答案:

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

}