当前位置: 首页 > news >正文

5.3 MVVM模型

一、MVVM的基本概念

MVVM的基本概念:Model、View、ViewModel

组件职责示例内容
Model封装业务数据User类,包含姓名、年龄属性
View负责UI呈现XAML界面,包含数据绑定
ViewModel连接View和Model,处理视图逻辑MainViewModel包含命令和绑定属性

二、例子:

2.1.Model

  // Models/User.cs
  public class User : INotifyPropertyChanged
  {
      private string _name;
      private int _age;

      public string Name
      {
          get => _name;
          set
          {
              _name = value;
              OnPropertyChanged(nameof(Name));
          }
      }

      public int Age
      {
          get => _age;
          set
          {
              _age = value;
              OnPropertyChanged(nameof(Age));
          }
      }
      public event PropertyChangedEventHandler PropertyChanged;
      protected virtual void OnPropertyChanged( string propertyName  )
      {
          PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
      }
  }

2.2 ViewModel

  // ViewModels/MainViewModel.cs
  public class MainViewModel : INotifyPropertyChanged
  {
      private User _user = new User { Name = "张三", Age = 25 };

      public User User
      {
          get => _user;
          set
          {
              _user = value;
              OnPropertyChanged(nameof(User));
          }
      }
      // 命令定义
      public ICommand SaveCommand
      {
          get
          {
              return new RelayCommand(SaveUser,  CanSaveExecute);
          }
      }
     bool CanSaveExecute()
      {
          return true;
      }

      private void SaveUser()
      {
          MessageBox.Show($"保存成功:{User.Name}, {User.Age}");
      }

      public event PropertyChangedEventHandler PropertyChanged;

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

2.3  ICommand (基本都是格式化的)

 public class RelayCommand : ICommand
 {
     private readonly Action _execute;
     private readonly Func<bool> _canExecute;

     public RelayCommand(Action execute, Func<bool> canExecute = null)
     {
         _execute = execute;
         _canExecute = canExecute;
     }

     public bool CanExecute(object parameter)
     {
         if (_canExecute == null)
         {
             return true;
         }
         else
             return _canExecute();
     }

     public void Execute(object parameter) => _execute();

     public event EventHandler CanExecuteChanged
     {
         add
         {
             if(_canExecute!=null)
             {
                 CommandManager.RequerySuggested += value;
             }                
         }
         remove
         {
             if (_canExecute != null)
             {
                 CommandManager.RequerySuggested -= value;
             }
         }           
     }
 }

2.4 调用

 public partial class Window1 : Window
 {
     //   public PersonViewModel m_PersonViewModel = new PersonViewModel();

     public MainViewModel model = new MainViewModel();
     public Window1()
     {
         InitializeComponent();
         DataContext = model;
     }
}
 <StackPanel Margin="15">
     <TextBox Text="{Binding User.Name,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
              Margin="0,0,0,10"/>

     <TextBox Text="{Binding User.Age, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
              Margin="0,0,0,10"/>

     <Button Content="保存" 
             Command="{Binding SaveCommand}"
             Padding="10,5"/>
 </StackPanel>

相关文章:

  • SSH 公私钥对使用指南
  • Flutter项目之页面实现以及路由fluro
  • (每日一道算法题)最长回文子串
  • 15三数之和解题记录
  • 使用 Flask 框架添加多个AI模型的API进行对话
  • 【读论文】——基于高光谱的玉米籽粒黄曲霉侵染方法研究
  • codis分布式集群
  • 【LeetCode 热题 100】解答汇总
  • 【NLP 50、损失函数 KL散度】
  • 第2.5节 iOS 覆盖率数据的采集
  • JAVA接口调用限速器
  • DQL语句-分组函数-查询
  • 7、linux c 进程通信
  • 深入探索 C++20 中的 std::make_obj_using_allocator
  • 数字换字母
  • 《机甲崛起》
  • VxKex无法通过快捷方式启动程序
  • Elasticsearch:使用 Azure AI 文档智能解析 PDF 文本和表格数据
  • 【Python】multiprocessing - 进程隔离
  • 使用crypto-js进行DES加/解密
  • wordpress自带播放器隐藏下载地址/哈尔滨网站优化流程
  • 网站制作工作室/网站优化内容
  • 网站主机名/营销策划与运营团队
  • 网站系统建设招标文件/怎么自己做网站
  • 便捷网站建设公司/网站提交收录入口链接
  • 网站首选域301如何做/郑州seo线上推广技术