如何将药品页集合项同步到主页集合视图及在ViewModel调用DisplayAlert
问题解决实现
1. ViewModel正确调用DisplayAlert的修正
你现有代码中新增的ForMessege类无实际作用,直接new空Page调用DisplayAlert会因为Page未挂载到视图树抛出异常,正确调用方式如下:
直接使用当前应用的主页面实例触发弹窗,修改AddMed方法:
public async void AddMed() { if (!string.IsNullOrEmpty(Medicine) && !string.IsNullOrEmpty(Unit) && !string.IsNullOrEmpty(Dosage) && !string.IsNullOrEmpty(Quantity)) { addMedicinechoice.Add(new ListMedicine { AddMedicine = Medicine, AddUnit = Unit, AddDosage = Dosage, AddQuantity = Quantity }); // 新增成功后可按需清空输入框内容 Medicine = Unit = Dosage = Quantity = string.Empty; } else if (!string.IsNullOrEmpty(Medicine) || !string.IsNullOrEmpty(Unit) || !string.IsNullOrEmpty(Dosage) || !string.IsNullOrEmpty(Quantity)) { // 直接用当前主页面调用弹窗,不需要自定义空Page await Application.Current.MainPage.DisplayAlert("تنبيه", "ادخل جمبع الحقول", "نعم"); } }
*补充说明:如果你的输入属性Medicine/Unit等需要和前端双向绑定,需要给ListMedicineViewModel实现INotifyPropertyChanged接口,推荐直接引用CommunityToolkit.Mvvm包,继承ObservableObject类,将属性改为如下形式,避免手写通知逻辑:
private string _medicine; public string Medicine { get => _medicine; set => SetProperty(ref _medicine, value); }
2. 药品页返回主页传递集合数据实现
推荐两种稳定的实现方案,按需选择:
方案1:消息订阅机制(无耦合推荐)
使用MVVM工具包自带的消息器完成跨ViewModel通信:
- 药品页关闭前,发送携带
addMedicinechoice集合的消息
// 药品页关闭逻辑中执行,以CommunityToolkit.Mvvm的IMessenger为例 WeakReferenceMessenger.Default.Send(new MedicineListChangedMessage(addMedicinechoice.ToList())); // 如果用Xamarin原生MessagingCenter MessagingCenter.Send(this, "MedicineListUpdated", addMedicinechoice.ToList());
- 主页ViewModel构造函数中订阅对应消息,收到后更新本地列表
// 主页ViewModel构造函数中添加 WeakReferenceMessenger.Default.Register<MedicineListChangedMessage>(this, (recipient, message) => { // 清空原有数据/增量添加按需调整 foreach (var item in message.UpdatedMedicineList) { 主页的目标列表.Add(item); } }); // Xamarin原生订阅写法 MessagingCenter.Subscribe<ListMedicineViewModel, List<ListMedicine>>(this, "MedicineListUpdated", (sender, list) => { foreach (var item in list) { 主页的目标列表.Add(item); } });
方案2:回调传递(简单场景快速实现)
打开药品页时,给药品页ViewModel传入回调委托:
// 药品页ViewModel新增回调属性 public Action<List<ListMedicine>> OnPageClosed { get; set; } // 药品页关闭前触发回调 OnPageClosed?.Invoke(addMedicinechoice.ToList()); // 主页打开药品页时传入回调 var medicineVm = new ListMedicineViewModel(Navigation) { OnPageClosed = (list) => { foreach (var item in list) { 主页的目标列表.Add(item); } } }; // 导航到药品页逻辑
内容的提问来源于stack exchange,提问作者Ra'ed
相关产品推荐
相关产品推荐

