C#学习教程:子视图模型更新时如何更新父视图模型列表。在我的xaml中,我有一个绑定到列表的列表框,在列表框内我有一个绑定到ActionViewModel属性的模板。到目前为止一切顺利,一切正常。选择其中一个列表项后,我导航到ActionViewModel并使用它来传递id。ActionViewModel从内存中的静态列表中检索信息,MainViewModel还从中检索信息以创建actionviewmodel列表。到目前为止一切顺利,我可以编辑属性,所有绑定工作正常,我很高兴。通过单击保存按钮,信息将被收集并存储在静态列表中。当我点击后退按钮时,我返回到列表,但不幸的是显示的值仍然相同,有什么方法可以发送命令重新加载列表中的项目?将完整的视图模型作为对新ActionViewModel的引用传递?或者告诉父级“列表中的这个视图模型已经更新”的一些属性?我确定上面的文字有点令人困惑,所以这里有一些代码来澄清它(希望如此)MainViewModel.csprivateList_actionViewModels;公共列表ActionViewModels{get{return_actionViewModels;}设置{_actionViewModels=值;RaisePropertyChanged(()=>ActionViewModels);}}私人Cirrious.MvvmCross.ViewModels.MvxCommand_navigateToAction;公共System.Windows.Input.ICommandNavigateToAction{get{_navigateToAction=_navigateToAction??newCirrious.MvvmCross.ViewModels.MvxCommand((Toactionate)=>Navigate));返回_navigateToAction;}}privatevoidNavigateToTheDesiredAction(intaction){ShowViewModel(new{id=action});}//从服务器或缓存中获取DTO并填充ActionViewModels列表publicasyncTaskLoad(){ActionServiceactionService=newActionService();列出actionViewModels=newList();MyA动作=等待actionService.GetMyActions();foreach(MyActions中的ActionDTO动作){ActionViewModelactionViewModel=newActionViewModel();等待actionViewModel.Load(action.id);actionViewModels.Add(actionViewModel);}ActionViewModels=actionViewModels;}ActionViewModel.cspublicintID{get{returnTheAction.id;}set{TheAction.id=value;RaisePropertyChanged(()=>ID);}}publicstringTitle{get{returnTheAction.Title;}set{TheAction.Title=value;RaisePropertyChanged(()=>标题);}}publicasyncTaskLoad(intactionId){ActionDTOTheAction=awaitactionService.GetAction(actionId);this.ID=TheAction.id;this.Title=TheAction.Title;私人Cirrious.MvvmCross.ViewModels.MvxCommand_save;公共System.Windows.Input.ICommand保存{获取{_save=_save??新Cirrious.MvvmCross.ViewModels.MvxCommand(PreSaveModel);返回_保存;}}privatevoidPreSaveModel(){SaveModel();}私有异步任务SaveModel(){ValidationDTO结果=awaitactionService.SaveAction(TheAction);}ActionService.cspublicstaticListAllActions=newList();publicasyncTaskGetAction(intactionId){ActionDTOaction=AllActions.FirstOrDefault(a=>a.id==actionId);if(action==null){inttempActionId=awaitLoadAction(actionId);如果(tempActionId>0)返回awaitGetAction(actionId);elsereturnnewActionDTO(){Error=newValidationDTO(false,"无法使用id加载操作"+actionId,ErrorCode.InvalidActionId)};}返回操作;}privateasyncTaskLoadAction(intactionId){ActionDTOaction=awaitwebservice.GetAction(actionId);AllActions.Add(动作);返回动作.id;}publicasyncTaskSaveAction(ActionDTOaction){列表currentList=AllActions;ActionDTOremoveActionFromList=currentList.FirstOrDefault(a=>a.id==action.id);如果(removeActionFromList!=null)currentList.Remove(removeActionFromList);当前列表。添加(操作);全法离子=当前列表;返回等待webservice.SaveAction(action);我能想到三种方法可以让您执行此操作ActionService可以在数据更改时发送某种通知。一种简单的方法是使用MvvmCrossMessenger插件。这就是CollectABull服务在CollectionService.cs中在mvvmcrossvideo中工作N+1天的方式(有关更多信息,请参阅http://mvvmcross.wordpress.com中的N=13)这是我通常使用的。它开销低,使用Wea??kReference(因此没有内存泄漏),易于扩展(任何对象都可以侦听更改),并且它鼓励ViewModel和Model对象的松散耦合您可以在列表ViewModel上实现某种刷新API,并且它可以从适当的视图事件调用,例如ViewDidAppear、OnNavigatedTo和OnResume。我通常不会使用这种方法来刷新已知数据,但我用它来启用/禁用资源密集型对象-例如用于某些模型数据形状的计时器(特别是它更改的频率)我可以想象这种方法的场景可能比信使方法更有效。您可以将INotifyPropertyChanged和INotifyCollectionChanged的??使用扩展回模型层。我已经做过几次了,它对我有用。如果您确实选择了这种方法,请注意确保所有视图都使用Wea??kReference订阅(例如在MvvmCross绑定中使用的订阅)来订阅更改事件-请参阅WeakSubscription。如果不这样做,即使UI本身已将其删除,模型也可能导致视图保留在内存中。以上就是C#学习教程:更新子视图模型时如何更新父视图模型。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
