Maui中使用MVVM

该文介绍了如何利用第三方库CommunityToolkit.Mvvm进行MVVM模式开发,包括简单类型属性和命令、集合类型属性和命令、复杂类型属性以及Task类型属性的使用,同时也涉及到了依赖注入的概念。
摘要由CSDN通过智能技术生成

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<T>的异步为AsyncRelayCommand<T>
        private ObservableCollection<string> names = new ObservableCollection<string> { "zs", "ls", "ww" };
        public ObservableCollection<string> Names
        {
            get => names;
            set => SetProperty(ref names, value);
        }

        private RelayCommand<string> addNameCommand;
        public RelayCommand<string> AddNameCommand => addNameCommand ??= new RelayCommand<string>(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<int> requestTask;
        public Task<int> RequestTask
        {
            get => requestTask;
            set => SetPropertyAndNotifyOnCompletion(ref requestTask, value);
        }
       

依赖注入类

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

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

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

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

 <ResourceDictionary>
                    <local:ServiceLocator x:Key="ServiceLocator"/>
                </ResourceDictionary>

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

 BindingContext="{Binding MainPageViewModel, Source={StaticResource ServiceLocator}}">
    <VerticalStackLayout>
        <Entry Text="{Binding UserName}" />
        <Entry Text="{Binding Password}" />
        <Label Text="{Binding Email}" />
        <Label Text="{Binding  Result}"/>
        <Button Command="{x:Binding ClickMeCommand}"/>
    </VerticalStackLayout>

 

最后的目录

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值