C#WPF使用CommunityToolkit.Mvvm库

C#WPF之快速理解MVVM模式

接上篇介绍MVVM,这里使用相关库介绍MVVM。

CommunityToolkit.Mvvm

CommunityToolkit.Mvvm介绍

CommunityToolkit.Mvvm是Microsoft Community Toolkit的一部分,它是一个轻量级但功能强大的MVVM(Model-View-ViewModel)库,旨在帮助开发者更容易地实现MVVM设计模式。

该库提供了一些基础类,如ObservableObject和ObservableRecipient,这些类实现了INotifyPropertyChanged接口,并提供了SetProperty方法,可以在属性值改变时触发PropertyChanged事件。这使得数据绑定变得更加简单和高效。

此外,该库还提供了ICommand接口的实现,如RelayCommand和AsyncRelayCommand,这些类可以帮助你创建命令,命令是MVVM模式中的一个重要组成部分。

CommunityToolkit.Mvvm还提供了一些其他有用的特性,如消息传递、设计时数据支持等,这些特性可以帮助你更好地组织和管理你的代码。

CommunityToolkit.Mvvm是一个强大的工具,它可以帮助你更容易地实现MVVM模式,从而提高你的代码质量和开发效率。

修改之后的ViewModel如下所示:

cs 复制代码
 public partial class MainViewModel :ObservableObject
 {
     public ObservableCollection<User> Users { get; set; }
     public ICommand AddUserCommand { get; set; }
     public ICommand TestCommand { get; set; }
     [ObservableProperty]
     private string? _name;
     /* public string? Name
      {
          get { return _name; }
          set
          {
              if (_name != value)
              {
                  _name = value;
                  OnPropertyChanged(nameof(Name));
              }
          }
      }*/
     public int MyProperty { get; set; }
     [ObservableProperty]
     private string? _email;
    /* public string? Email
     {
         get { return _email; }
         set
         {
             if (_email != value)
             {
                 _email = value;
                 OnPropertyChanged(nameof(Email));
             }
         }
     }*/
     public MainViewModel()
     {
         Users = UserManager.GetUsers();
         AddUserCommand = new Commands.RelayCommand(Adduser, CanAddUser);
         TestCommand = new Commands.RelayCommand(TestAction, CanTest);

     }

     public event PropertyChangedEventHandler? PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName)
     {
         PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

     }
     [RelayCommand]
     private void Adduser(object obj)
     {
         User user = new User();
         user.Name = Name;
         user.Email = Email;
         UserManager.AddUser(user);
     }
     private bool CanAddUser(object obj)
     {
         return true;
     }
     private bool CanTest(object obj)
     {
         return true;
     }
     [RelayCommand]
     private void TestAction(object obj)
     {
         Users[0].Name = "demo";
         Users[0].Email = "1130@qq.com";
         //Name = "demo";
         //Email = "1130@qq.com";
     }
 }

修改之后的User类如下所示:

cs 复制代码
   public partial class User:ObservableObject
   {
       [ObservableProperty]
       private string? _name;
       /* public string? Name 
        {
            get { return _name; }

            set 
            { 
                if(_name!= value)
                {
                    _name = value;
                    OnPropertyChanged(nameof(Name));
                }
            }
        }
*/
       [ObservableProperty]
       private string? _email;
       /*public string? Email
       {
           get { return _email; }

           set
           {
               if (_email != value)
               {
                   _email = value;
                   OnPropertyChanged(nameof(Email));
               }
           }
       }*/
       public event PropertyChangedEventHandler? PropertyChanged;
       protected virtual void OnPropertyChanged(string propertyName)
       {
           PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
       }
   }

现在我们的ViewModel与Model就可以简化了。

MVVM模式,创建实现ICommand接口的RelayCommand类,实现INotifyPropertyChanged接口的MainViewModel类与User类。使用数据绑定与命令绑定改写xaml页面。

最后手动实现MVVM模式,需要写很多代码,比较复杂与麻烦,我们使用MVVM库来简化MVVM模式的实现。

相关推荐
“AI国潮设计-小江”6 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
程序喵大人6 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
sunshine22 girl7 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
菜鸟~noob2338 小时前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
惊讶的猫9 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python
cmpxr_9 小时前
【MicroPython】如何刷新ESP8266的固件
开发语言·micropython
搭贝9 小时前
上厕所的时间搭好一套系统:AI自动生成实测
开发语言·人工智能·低代码·ai·php·搭贝
智感子10 小时前
智能称重·数据上云:从仪表读数到可追溯的计量凭证
开发语言·php
\光辉岁月/10 小时前
7.javase-面向对象
java·开发语言
weixin_5310946910 小时前
heap_4内存管理
java·开发语言·算法