首页 > 其他分享 >【WPF】MVVM极其简单的例子

【WPF】MVVM极其简单的例子

时间:2024-03-16 16:13:25浏览次数:22  
标签:execute MVVM MainWindow 例子 User new WPF public RelayCmd

目的:通过例子了解、理解MVVM的基本结构。

Model

namespace WpfStudy.Model
{
    public class UserModel
    {
        public string Name { get; set; }
    }
}

ViewModel

namespace WpfStudy.ViewModel
{
    public class MainVM : NotifyPropBase
    {
        public MainVM(MainWindow view)
        {
            View = view;
        }
        private MainWindow View { get; set; }

        private UserModel _userModel;

        public UserModel User
        {
            get
            {
                if (_userModel == null)
                {
                    _userModel = new UserModel();
                }
                return _userModel;
            }
            set { _userModel = value; Notify(); }
        }

        public RelayCmd ClickCmd => new RelayCmd((a) =>
        {
            MessageBox.Show(User.Name);
            User.Name = null;
            User = User;//或者使用Notify("User");
        });

        public RelayCmd CloseCmd => new RelayCmd((a) =>
        {
            View.Close();
        });
    }
}

View

xaml

    <Window.Resources>
        <Style TargetType="Button">
            <Setter Property="Width" Value="100"/>
            <Setter Property="Height" Value="30"/>
            <Setter Property="Margin" Value="0,30,0,0"/>
        </Style>
    </Window.Resources>
    <StackPanel Margin="20">
        <TextBox Text="{Binding User.Name}" Width="100" Height="40" Margin="0,0,0,20" FontSize="30"/>
        <Button Content="清空" Command="{Binding ClickCmd}"/>
        <Button Content="关闭窗口" Command="{Binding CloseCmd}"/>
    </StackPanel>

cs

namespace WpfStudy
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MainVM(this);
        }
    }
}

两个工具类

监听属性变化

    public class NotifyPropBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void Notify([CallerMemberName] string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

监听命令

    public class RelayCmd : ICommand
    {
        public RelayCmd(Action<object> execute)
        {
            _execute = execute;
        }

        readonly Action<object> _execute;

        public event EventHandler CanExecuteChanged;

        public bool CanExecute(object parameter) => true;

        public void Execute(object parameter)
        {
            _execute?.Invoke(parameter);
        }
    }

总结

  1. Model里面就写CLR属性,不搞属性值变化的监听。

  2. View的cs代码也要简洁,只有一个显式的构造函数,不搞属性和方法。

  3. 业务交互功能集中在ViewModel中。

标签:execute,MVVM,MainWindow,例子,User,new,WPF,public,RelayCmd
From: https://www.cnblogs.com/redcode/p/18077165

相关文章

  • Revit插件界面(WPF)白屏问题
    Revit插件界面(WPF)白屏问题问题描述最近客户反馈了一个问题,说新给到的Revit插件界面一片空白。很奇怪,这个插件测试过是没问题的,让客户看看以前版本的怎么样,发现也是空白的。询问近期是否有安装什么东西,得知安装了另一个插件;然后尝试卸载了再查看,发现好了。原因分析后来拿到......
  • 【WPF】设置全局样式
    目的:创建一个资源字典,然后自动引入到各个Window或UserControl中,可以随意使用。方式:创建Style文件夹在Style文件夹内创建一个ButtonStyleStyle.xaml的资源字典示例如下:<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"......
  • 打造真实感十足的速度表盘:WPF实现动态效果与刻度绘制
     概述:这个WPF项目通过XAML绘制汽车动态速度表盘,实现了0-300的速度刻度,包括数字、指针,并通过定时器模拟速度变化,展示了动态效果。详细实现包括界面设计、刻度绘制、指针角度计算等,通过C#代码与XAML文件结合完成。新建WPF项目:在VisualStudio中创建一个新的WPF项目。......
  • WPF中轻松操控GIF动画:WpfAnimatedGif库详解
    概述:在WPF中使用`WpfAnimatedGif`库展示GIF动画,首先确保安装了该库。通过XAML设置Image控件,指定GIF路径,然后在代码中使用库提供的方法实现动画控制。这简化了在WPF应用中处理GIF图的过程,提供了方便的接口来管理动画播放和暂停。当使用 WpfAnimatedGif 库在WPF中显示GIF图动......
  • WPF线程模型
    1.渲染系统概述WPF采用保留模式渲染系统(RetainedModeRenderingSystem),该系统可分为UI线程和复合线程两个主要部分,两者协作完成WPF应用程序的渲染工作。1.1立即模式GUI和保持模式GUI图形API可分为保留模式API和即时模式API。Direct2D是一种即时模式API。WPF......
  • WPF 禁止程序重复运行
    Location:App.xaml.csCode:添加如下代码privatestaticSystem.Threading.Mutexmutex;//系统能够识别有名称的互斥,因此可以使用它禁止应用程序启动两次//第二个参数可以设置为产品的名称:Application.ProductName//每次启动应用程序,都会验证名称......
  • WPF —— Grid网格布局
    1:Grid网格布局简介Grid为WPF中最常用的布局容器,作为View中的主要组成部分,负责框架中整体的页面布局。2:网格标签Grid.ColumnDefGrid.ColumnDefinitions自定义列只能设置宽度不能设置高度ColumnDefinition每一个列可以设置宽度,宽度可以是一个具体值也可以设置*的意......
  • 【C#】WPF获取屏幕分辨率
    SystemParameters提供的接口,其实是获取渲染过程中的实际高宽,是受系统DPI设置的影响。以1920*1080和125%DPI为例:分辨率高度:1080,实际获取的高度为:864。分辨率宽度:1920,实际获取的宽度为:1536。 结果展示代码需要额外的包 usingSystem.Drawing;usingSystem;using......
  • 通过构造函数实现属性赋值(含有具体例子)
    一、什么是构造函数?new关键字实际上是在调用一个方法,这个方法叫构造方法(构造器)调用构造器的时候,如果你的类中没有写构造器,那么系统会默认给你分配一个构造器,只是我们看不到罢了。可以自己显式的将构造器编写出来:构造器的格式:[修饰符]构造器的名字(){}构造器和方法的......
  • 【论文阅读】Natural Adversarial Examples 自然对抗的例子
    文章目录一、文章概览(一)摘要(二)导论(三)相关工作二、IMAGENET-A和IMAGENET-O(一)数据集构造方式(二)数据收集过程三、模型的故障模式四、实验(一)评估指标(二)使用数据增强(三)使用更多更真实的标记数据(四)架构变化策略一、文章概览(一)摘要文章的主要工作:使用简单的对抗性过......