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

如何在MVVM(WPF)中编写“ViewModelBase”分享

时间:2023-04-10 13:54:46 C#

MVVM中如何编写“ViewModelBase”(WPF)我正在尝试使用MVVM设计模式编写程序。我做了一些研究并阅读了一些与之相关的文章,很多次我都遇到过这个问题ViewModelBase我知道它是什么..但是我能具体知道我应该从哪里开始写我自己的ViewModelBase吗?就像......真正了解正在发生的事情而不会变得太复杂。谢谢:)如果您不知道内部发生了什么,那么使用MVVM框架就没有任何价值。那么让我们一步步构建自己的ViewModelBase类吧。ViewModelBase是所有视图模型的通用类。让我们将所有通用逻辑移至此类。你的ViewModel应该实现INotifyPropertyChanged(你明白为什么吗?)publicabstractclassViewModelBase:INotifyPropertyChanged{protectedvirtualvoidOnPropertyChanged([CallerMemberName]stringpropertyName=null){PropertyChanged,newEvoke());[CallerMemberName]属性不是必需的,但它允许您编写:OnPropertyChanged();而不是OnPropertyChanged("SomeProperty");,因此您将避免在代码中使用字符串常量。示例:publicstringFirstName{set{_firtName=value;OnPropertyChanged();//而不是OnPropertyChanged("FirstName")或OnPropertyChanged(nameof(FirstName))}get{return_firstName;}}请注意,不推荐使用nameofOnPropertyChanged(()=>SomeProperty),因为我们在C#6中有nameof运算符。通常的做法是像这样实现调用PropertyChanged的??属性:publicstringFirstName{get{return_firstName;}set{SetProperty(ref_firstName,value);让我们在viewmodelbase中定义SetProperty:存储=价值;this.OnPropertyChanged(propertyName);返回真;PropertyChanged事件在属性值更改并返回true时触发。当值未更改并返回false时,它??不会触发事件。基本思想是SetProperty方法是虚拟的,您可以在更具体的类中扩展它,例如触发验证,或通过调用PropertyChanging事件。很美丽。这是您在此阶段应该包含的所有ViewModelBase。其余的取决于您的项目。例如,您的应用程序使用页面基本导航,并且您编写了自己的NavigationService来处理来自ViewModel的导航。因此,您可以将NavigationSerivce属性添加到您的ViewModelBase类,以便您可以根据需要从所有视图模型访问它。为了提高可重用性和维护SRP,我有一个名为BindableBase的类,它几乎是我们在此处所做的INotifyPropertyChanged的??实现。我在每个WPF/UWP/Silverligt/WindowsPhone解决方案中重复使用此类,因为它是通用的。然后我在每个项目中创建从BindableBase派生的自定义ViewModelBase类:publicabstractViewModelBase:BindableBase{//所有视图模型的项目特定逻辑。//例如,在这个项目中,我想大量使用EventAggregator:publicvirtualIEventAggregator()=>ServiceLocator.GetInstance()}如果我有使用基于页面的导航的应用程序,我还为页面视图模型指定基类。publicabstractPageViewModelBase:ViewModelBase{//例如我所有的页面都有标题:publicstringTitle{get;privateset;}}我可以有另一个对话类:publicabstractDialogViewModelBase:ViewModelBase{privatebool?_dialogResult;公共事件EventHandlerClosing;公共字符串标题{get;私有集;}公共ObservableCollectionDialogBu??ttons{得到;公共布尔?DialogResult{得到{返回_dialogResult;}set{SetProperty(ref_dialogResult,value);}}publicvoidClose(){Closing?.Invoke(this,EventArgs.Empty);你有一些nuget包来实现MVVMMVVMLightMVVMCrossPrism对我来说,对于初学者来说更容易的是MVVMLight,因为它提供了一些代码示例。因此,更好的方法是安装此nuget包,查看生成的代码,并在需要时回复我们以获得更多解释。我喜欢这个BaseVewModel,它为您的视图模型提供了一种干净利落的风格。查看各种“之前”和“之后”的比较。当然,没有什么是强制性的-如果您不喜欢BaseViewModel提供的功能,请不要使用它。或者修改它,因为你有源代码。请特别注意,有三种不同的方法可以通过更改通知来实现属性-选择您理解/感觉舒适的复杂程度。在大多数MVVM框架中,基ViewModel类实际上包含很少的代码——通常只是INotifyPropertyChanged的??实现和一些辅助函数。查看MVVMLight的ViewModelBase和ObservableObject类的源代码。ObservableObject主要是一个INotifyPropertyChanged实现-使用lambda表达式而不是属性名称的“魔术字符串”。ViewModelBase扩展了ObservableObject并且主要是一种实用方法,用于确定您是否在VisualStudio设计器中运行这里有一个很好的讨论:https://codereview.stackexchange.com/q/关于主题13823。将表达式用于在引发属性更改通知时获得类型安全。以上就是C#学习教程:Howtowrite"ViewModelBase"inMVVM(WPF)。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: