当前位置: 首页 > 编程语言 > C#

WPFMVVM双向更新分享

时间:2023-04-10 13:36:19 C#

WPFMVVM双向更新这些是相关的代码段:XAML:InitializeAddstudentChangestudents(...)主窗口:publicpartialclassMainWindow:Window{internalMainWindowViewModelmyMWVM;publicMainWindow(){InitializeComponent();}privatevoidclkInit(objectsender,RoutedEventArgse){myMWVM=newMainWindowViewModel();DataContext=myMWVM;}privatevoidclkStudent(objectsender,RoutedEventArgse){myMWVM.StudentViewModels.Add(newStudentViewModel());}//用于测试-从学生类中调用一个函数以在那里进行更改.ElementAt((int)i).changeStudent();}}}主要观察点:classMainWindowViewModel:INotifyPropertyChanged{ObservableCollection_studentViewModels=newObservableCollection();//WPF的集合。公共ObservableCollectionStudentViewModels{得到{返回_studentViewModels;}}//构造函数。添加两个studepublicMainWindowViewModel(){_studentViewModels.Add(newStudentViewModel());_studentViewModels.Add(newStudentViewModel());}//属性改变。公共事件PropertyChangedEventHandlerPropertyChanged;privatevoidOnPropertyChanged(stringpropertyName){if(PropertyChanged!=null){PropertyChanged(this,newPropertyChangedEventArgs(propertyName));}}}学生观点:classStudentViewModel:INotifyPropertyChanged{Lazy_model;字符串_studentFirstName;公共字符串StudentFirstName{get{return_studentFirstName;}set{if(_studentFirstName!=value){_studentFirstName=value;_model.Value.StudentFirstName=值;OnPropertyChanged("StudentFirstName");}}}字符串_studentLastName;publicstringStudentLastName{get{return_studentLastName;}set{if(_studentLastName!=value){_studentLastName=value;_model.Value.StudentLastName=值;OnPropertyChanged("StudentLastName");}}}公众号dchangeStudent(){_model.Value.changeStudent();}publicStudentViewModel(){_studentFirstName="默认";_model=newLazy(()=>newStudent());}公共事件PropertyChangedEventHandlerPropertyChanged;privatevoidOnPropertyChanged(stringpropertyName){if(PropertyChanged!=null){PropertyChanged(this,newPropertyChangedEventArgs(propertyName));}}}Student:classStudent{publicstringStudentFirstName{get;放;}publicstringStudentLastName{get;放;}publicStudent(){MessageBox.Show("Studentconstructorcalled");}publicStudent(stringnm){StudentLastName=nm;}publicvoidchangeStudent(){StudentLastName="McDonald";如果你读了这篇文章,我已经谢谢你了:)尽管如此,通过调用“clkChangeStudent”,我没有看到文本框中的变化,我猜这是因为我没有调用StudentViewModel的set方法。我正在从事的项目有点复杂,课堂上(这里是学生)本身发生了很多事情。如何通过设置Student-class本身的值来更新文本框?您的实际代码显然不会收到界面更改的通知。原因很简单。更改学生姓名的方法在Student模型中,没有实现INotifyPropertyChanged。根据一个问题,这个问题有两种解决方案,changeStudent()方法是否必须坚持对象模型,即您的需求是否允许您将changeStudent()方法移动到视图模型?如果是,那么,第一个解决方案,只需从模型中删除changeStudent方法并将其移动到视图模型,如下所示:在另一种情况下,即第二种解决方案,您必须在模型属性更改时引发事件,然后让您的视图模型继承这些更改。你可以在你的模型中这样进行:classStudent:INotifyPropertyChanged{...privatestringstudentLastName;publicstringStudentLastName{get{returnthis.studentLastName;}set{if(this.studentLastname!=value){this.studentLastName=value;this.OnPropertyChanged("StudentLastName");}}}}对于ViewModel:classStudentViewModel:INotifyPropertyChanged{...publicStudentViewModel(Studentmodel){this._model=model;this._model.PropertyChanged+=(sender,e)=>{if(e.PropertyName=="StudentLastName"){this.OnPropertyChanged("StudentLastName");}};}}两种解决方案都有效。了解您的代码明确需要在值更改时通知接口非常重要。ChangeStudent不会调用任何在视图模型中触发属性通知事件的方法,而是更改基础模型。正是这些事件触发了视图自我更新。此外,您应该从视图中查看命令绑定,而不是在代码隐藏中使用点击处理程序。这样你的视图就不需要知道额外的视图模型并且可以是纯粹的展示。首先,您应该使用命令而不是事件。在您当前的结构中,您必须添加一个OnPropertyChanged("StudentLastName");在StudentViewModel中调用您的ChangedStudent()方法。之后,您必须将Bindings的UpdateSourceTrigger设置为PropertyChanged。以上就是《C#学习教程:WPFMVVM双向更新分享》的全部内容。如果对大家有用,需要详细了解C#学习教程,希望大家多加关注——Text="="{BindingPath=StudentFirstName,UpdateSourceTrigger=PropertyChanged}"本文收集自网络,确实不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处: