【问题标题】:How to add fields that dinamically change values in binded variables如何在绑定变量中添加动态更改值的字段
【发布时间】:2017-02-27 23:05:24
【问题描述】:

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

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

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

Article List

【问题讨论】:

    标签: xaml xamarin xamarin.forms


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答!这确实是我的目标,但它是否适用于我的列表视图中的每个元素?我的 listview 将从我的 viewModel 中填充 Item 对象,并且每个标签的每个标签都有每个 Item 的价格...我担心如果我这样做一旦我在输入时更改它会更新所有其他项目的价格。跨度>
    • 只要每个项目的 ViewModel 都有自己的“乘数”属性,它就不会影响其他行。
    • 感谢您的帮助!
    【解决方案2】:

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

    【讨论】:

    • 我明白你在说什么,但是这样我就必须写出确切的值来改变标签的值,假设我想要值 300,我会在条目中写 300 .我不想要那个。例如,我想在标签中设置值 150 并在条目中输入 2 使其变为 300。在这种情况下,我不能将它绑定到同一个属性。我希望这次我把自己说清楚了。哦,这个条目必须添加到列表视图中的每个元素,因为我想为不同的产品添加不同的值....
    【解决方案3】:

    实现这一点的最简单方法可能是将每个Item 包装在ItemViewModel 中。

    ItemViewModel 有一个公共属性 Multiplier,其中 - 在 Setter 中 - 包含 Item 的价格将被更新。

    要在视图中反映价格变化 - 它必须实现 INotifyPropertyChanged 并且当然在设置“价格”时引发事件。

    或者:将 Item 中的 Price 复制到构造函数中的 ItemViewModelItemViewModel 上的附加 Price 属性

    使用示例代码,您需要 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; }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-09
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      相关资源
      最近更新 更多