WPF中点击一个ListView元素如何刷新另一个ListView(POS系统场景)
实现方案
1. 修改ViewModel的商品选中逻辑
直接在ArticleSelected属性的setter中添加商品到订单列表的逻辑,支持同款商品数量自动累加,避免重复生成行:
注意先把原来的
_ArticleSelected字段初始化代码改成private ArticleModel _ArticleSelected;,去掉默认的new ArticleModel(),避免页面加载时自动添加空商品到订单。
public ArticleModel ArticleSelected { get { return _ArticleSelected; } set { _ArticleSelected = value; NotifyPropertyChanged(nameof(ArticleSelected)); // 新增添加到订单列表的逻辑 if (_ArticleSelected != null) { // 先查找订单中是否已有同款商品 var existedItem = ListCommande.FirstOrDefault(x => x.IdArticle == _ArticleSelected.IdArticle); if (existedItem != null) { // 已有同款,数量+1 existedItem.Quantite += 1; // 如果ArticleModel实现了INotifyPropertyChanged,这里不需要额外操作,否则手动刷新订单视图 CommandeCollection.Refresh(); } else { // 没有同款,新增商品到订单,注意不要直接用原有实例,避免两边数据联动修改 ListCommande.Add(new ArticleModel { IdArticle = _ArticleSelected.IdArticle, NomArticle = _ArticleSelected.NomArticle, Prix = _ArticleSelected.Prix, Code = _ArticleSelected.Code, Quantite = 1, // 其他需要的属性自行赋值 }); } // 可选:计算订单总价,替换原来写死的金额 CalculTotalAmount(); } } } // 新增总价计算方法 private void CalculTotalAmount() { TotalAmount = ListCommande.Sum(x => x.Prix * x.Quantite); } // 新增总价属性用于绑定 private decimal _totalAmount; public decimal TotalAmount { get => _totalAmount; set { _totalAmount = value; NotifyPropertyChanged(nameof(TotalAmount)); } }
2. XAML调整(可选,确保点击图片触发选中)
如果当前点击图片没有触发ListView的选中事件,可以给商品模板里的Image控件加IsHitTestVisible="True"确保点击事件能透传到ListView项:
找到商品列表的Image标签,修改为:
<Image ToolTip="{Binding Carracteristique}" Source="https://phonesdata.com/files/models/Xiaomi-Redmi-Note-10S-298.jpg" HorizontalAlignment="Stretch" VerticalAlignment="Top" Stretch="UniformToFill" MinHeight="50" MaxHeight="100" IsHitTestVisible="True" />
如果要实现点击图片即时触发,也可以给Image加MouseLeftButtonDown事件,后台代码直接处理:
先在XAML加事件:
<Image ... MouseLeftButtonDown="Image_MouseLeftButtonDown" />
然后在ArticlesDetails.xaml.cs后台加逻辑:
private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (sender is Image img && img.DataContext is ArticleModel article) { var vm = DataContext as ArticlesDetailsViewModel; vm.ArticleSelected = article; } }
3. 总价绑定替换(可选)
把订单列表页写死的总价改成绑定你的TotalAmount属性:
<Label Grid.Row="1" Grid.Column="1" FontWeight="SemiBold" Content="{Binding TotalAmount, StringFormat={}{0} XFA}" FontSize="17" Width="auto" VerticalAlignment="Center" HorizontalAlignment="Stretch" FontStyle="Normal" />
说明
- 因为
ListCommande是ObservableCollection类型,添加/修改元素时会自动发送变更通知,绑定的CommandeCollection会自动刷新,不需要额外手动调用刷新方法。 - 注意
ArticleModel类需要给Quantite属性也实现INotifyPropertyChanged,这样修改数量时订单列表会自动更新数值。
内容的提问来源于stack exchange,提问作者Jules auffred
相关产品推荐
相关产品推荐

