Maui中使用MVVM

MVVM使用有很多种,大家自行学习。这里为了示例连续,用第三库。

nuget  CommunityToolkit.Mvvm

具体内容自行学习。我也说网上边学边用。

建立viewmode

 [ObservableObject]
    public partial class MainPageViewModel
    {
        //定义一个无参构造函数,方便创建对象时调用,因为下例中使用了有参构造函数
        public MainPageViewModel() { }


        //①简单类型属性和命令。注:RelayCommand的异步为AsyncRelayCommand===============================================
        private string result = "HiWorld!";
        public string Result
        {
            get => result;
            //SetProperty方法,比较旧值和新值是否相等,如果不相等,则将新值value赋值给_result,并触发属性更改事件
            set => SetProperty(ref result, value);
        }

        private RelayCommand clickMeCommand;
        public RelayCommand ClickMeCommand =>
            clickMeCommand ??= new RelayCommand(() => Result = "你好世界!");//如果_clickMeCommand不为空,则赋值回调函数



        //②集合类型属性和命令(带参数)=================================================================================
        //注,①集合List无事件通知机制,不能用于绑定属性;②RelayCommand的异步为AsyncRelayCommand
        private ObservableCollection names = new ObservableCollection { "zs", "ls", "ww" };
        public ObservableCollection Names
        {
            get => names;
            set => SetProperty(ref names, value);
        }

        private RelayCommand addNameCommand;
        public RelayCommand AddNameCommand => addNameCommand ??= new RelayCommand(AddName);
        private void AddName(string name)
        {
            Names.Add(name);
        }



        //③复杂类型的某个属性,较少使用=================================================================================
        //可以实现复杂类型某个属性更改通知,较少使用
        //如果是定义User属性,则整个对象替换时,才会有属性更改通知,也就是引用类型是浅绑定,类似于Vue2的引用类型data
        private readonly User user;
        public MainPageViewModel(User user) => this.user = user;
        public string Name
        {
            get => user.UserName;
            //SetProperty重载方法,user.Name-旧值,value-新值,user-复杂类型。判断user.Name和新值value是否相等,如果不想等,则将新值赋值给u.Name,并触发属性更改事件
            set => SetProperty(user.UserName, value, user, (user, value) => user.UserName = value);
        }



        //④Task类型属性,较少使用=====================================================================================
        //主要用于加载任务的提示,如任务完成,通知UI更新,还没使用过。
        private TaskNotifier requestTask;
        public Task RequestTask
        {
            get => requestTask;
            set => SetPropertyAndNotifyOnCompletion(ref requestTask, value);
        }
       

依赖注入类

 /// 
    /// 依赖注入
    /// 
    public class ServiceLocator
    {
        //服务定位器字段,使用这个字段来获取服务
        private IServiceProvider serviceProvider;
        //******以下定义属性,通过serviceProvider返回需要的服务(对象)
        public MainPageViewModel MainPageViewModel => serviceProvider.GetService();

        //构造函数,创建ServiceLocator对象时,①创建容器;②注册ViewModel服务;③创建服务定位器。
        public ServiceLocator()
        {
            var serviceCollection = new ServiceCollection();
            //******以下注册服务
            serviceCollection.AddSingleton();

            //【注意顺序】,服务定义器在注册完所有服务后,再创建
            serviceProvider = serviceCollection.BuildServiceProvider();
        }
    }

根页面App.xaml的资源字典中,创建ServiceLocator对象 ,一次性注册所有需要的服务

 
                    
                

Maui中使用MVVM_第1张图片

在View层,MainPage.xaml页面中,设置BindingContext,绑定ServiceLocator对象的MainPageViewModel属性

 BindingContext="{Binding MainPageViewModel, Source={StaticResource ServiceLocator}}">
    
        
        
        

 Maui中使用MVVM_第2张图片

最后的目录

Maui中使用MVVM_第3张图片 

 

你可能感兴趣的:(MAUI)