当前位置: 首页 > 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>
http://www.dtcms.com/a/94478.html

相关文章:

  • 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加/解密
  • 常用的排序算法------练习2
  • JumpServer:一款企业级开源堡垒机
  • mapbox进阶,仿照百度,加载marker点位,移入marker点切换图标,点击展示气泡,气泡和marker联动
  • Ubuntu系统保姆级Paperless-ngx部署指南:零基础实现文档云端化管理
  • LeetCode 热题 100_爬楼梯(81_70_简单_C++)(动态规划)
  • SLAM文献之-NR-SLAM: Non-Rigid Monocular SLAM
  • 使用独立服务器的最佳方式指南
  • 【软件测试】一篇总结软件测试的基础知识
  • redis(主从复制)教程
  • 播放本地视频-实现视频画廊功能