WPF中使用MVVM模型进行数据绑定

news2025/8/3 2:29:36

文章目录

  • 前言
  • 一、声明一个类用来实现接口 INotifyPropertyChanged
  • 二、实例化ViewModel对象
    • 1.新建MainViewModel模型类
    • 2.实例化对象
  • 三、在界面设计代码中进行绑定
  • 四、应用


前言

WPF数据绑定对于WPF应用程序来说尤为重要,本文将讲述使用MVVM模式进行数据绑定的四步走用法:
我们可以先在项目下新建几个目录:Core、Models、ViewModels
在这里插入图片描述


一、声明一个类用来实现接口 INotifyPropertyChanged

在Core文件夹新建类文件:NotifyPropertyObject .cs
示例代码如下

public class NotifyPropertyObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        if(PropertyChanged != null)
        {
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }


}

二、实例化ViewModel对象

1.新建MainViewModel模型类

在ViewModels文件夹新建类文件:MainViewModel .cs
示例代码如下

public class MainViewModel: NotifyPropertyObject
{
     private int _MyValue;

     public int MyValue
     {
         get { return _MyValue; }
         set
         { 
             _MyValue = value;
             OnPropertyChanged("MyValue");
         }
     }

     public List<string> StrList { get; set; }

     public MyStudent MyStudent { get; set; }

     public MainViewModel()
     {
         MyStudent = new MyStudent();

         StrList = new List<string>() { "1","2","3","4","5"};

     }
 }

2.实例化对象

在App.xaml.cs中编辑
代码如下(示例):

public static ViewModels.MainViewModel MainViewModel { get; private set; }

public App()
{
    MainViewModel = new ViewModels.MainViewModel();
}

在主界面后台代码中声明ViewModel

public partial class MainWindow : Window
{
    public ViewModels.MainViewModel ViewModel { get { return App.MainViewModel; } }
    
	public MainWindow()
    {
        InitializeComponent();

        this.DataContext = ViewModel;

        this.Loaded += MainWindow_Loaded;
    }
}

为每一个界面建立其模型类,如MainViewModel,AzimuthWindowVM…,此种类型的类同样需继承自类NotifyPropertyObject
注意:(1)此类中主要添加后台的实现代码,其一是使后台代码尽可能简单;其二是便于数据的绑定(2)此类中大多数情况下写的是属性和方法


三、在界面设计代码中进行绑定

.xaml文件

<StackPanel Orientation="Vertical" Grid.Row="0">
    <TextBox Text="{Binding MyStudent.Age ,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="100" Height="40" Margin="10"></TextBox>
    <Button Content="Click1" Click="Button_Click1" Width="100" Height="50"></Button>
</StackPanel>

<StackPanel Orientation="Vertical" Grid.Row="1">
    <TextBox Text="{Binding MyValue ,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" Width="100" Height="40" Margin="10"></TextBox>
    <Button Content="Click" Click="Button_Click" Width="100" Height="50"></Button>
</StackPanel>

四、应用

后台代码:

 private void Button_Click(object sender, RoutedEventArgs e)
 {
     Console.WriteLine(ViewModel.MyValue);

     ViewModel.MyValue = 20;

     //OneWayToSource ----编辑框编辑值时 ViewModel.MyValue可以获取到值,但是ViewModel.MyValue改变时,binding的编辑框无法更改
     //OneWay         ----编辑框编辑值时 ViewModel.MyValue值无法更新。但是ViewModel.MyValue改变时,binding的编辑框更新了
     //TwoWay         ----编辑框编辑值时 ViewModel.MyValue可以获取到值,且ViewModel.MyValue改变时,binding的编辑框也更新了

     //对于OneWay绑定:在界面中显示的数据可以随数据源的值的变化而变化,但更改界面的数据不会影响到数据源。
     //对于TwoWay绑定:界面中显示的数据及数据源的数据可以双向显示及更新。
     //对于OneWayToSource绑定:初始时界面的数据为空;更改界面的数据可以影响数据源的值,但是更改数据源的值不会体现在界面上。
     //对于OneTime绑定:在界面中显示的为数据源的初始值,更改数据源的值的时候,不会更改界面的数据显示;更改界面的数据也不会影响到数据源的数据。


     //UpdateSourceTrigger 属性的角色:
     //PropertyChanged:当绑定目标属性更改时,立即更新绑定源。
     //LostFocus:当绑定目标元素失去焦点时,更新绑定源。
     //Explicit:仅在调用 UpdateSource 方法时更新绑定源。
     //注释:多数依赖项属性的UpdateSourceTrigger 值的默认值为 PropertyChanged,而 Text 属性的默认值为 LostFocus。
 }

 private void Button_Click1(object sender, RoutedEventArgs e)
 {
     Console.WriteLine(ViewModel.MyStudent.Age);
 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何实现一个优秀的 HashTable 散列表?

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 提问。 前言 大家好&#xff0c;我是小彭。 在前几篇文章里&#xff0c;我们聊到了 Java 中的几种线性表结构&#xff0c;包括 ArrayList、LinkedList、ArrayDeque 等。今天&#xf…

ArcGIS绘制地球

下面这个图是非常不错的&#xff0c;截取自论文的一张图&#xff1a; 学了十几年地理学&#xff0c;最初的兴趣恐怕还是小时候常常摆弄的地球仪&#xff1b;现在终于有机会尝试地球仪风格制作了。 虽然迟到了十几年&#xff0c;不过今天还是有机会“复现”小时候的地球仪。 先…

使用docker-compose部署达梦DEM管理工具,mac m1系列适用

之前搭建了mac m1下基于docker的达梦库&#xff08;地址&#xff09;&#xff0c;但是没有一个好用的管理端。 用过DBeaver&#xff0c;可以使用自定jar创建dm链接&#xff0c;只做简单查询还行&#xff0c;要是用到一些修改、大文本查看、配置修改等高级点的功能就不行了。 …

Redis-使用java代码操作Redis

目录 Java连接Redis Java链接 测试是否连接 Java操作Redis Redis字符串(String) Redis哈希(Hash) Redis列表&#xff08;List&#xff09; Redis集合&#xff08;Set&#xff09; Java连接Redis 前置条件&#xff1a;Redis的服务要开启 pom依赖 <dependency>&l…

小熊U租港交所上市:市值28亿港元 京东联想腾讯是股东

雷递网 雷建平 11月24日小熊U租母公司凌雄科技集团有限公司&#xff08;简称&#xff1a;“凌雄科技”&#xff0c;股票代码为&#xff1a;“02436”&#xff09;今日在港交所上市。凌雄科技发行价为7.6港元&#xff0c;募资总额为3.37亿港元。凌雄科技开盘价为7.9港元&#xf…

C++17 --- 多态性、虚函数、多态的条件、联编(捆绑,绑定)

一、多态性 1、多态 多态性是面向对象程序设计的关键技术之一。 若程序设计语言不支持多态性&#xff0c;不能称为面向对象的语言。 多态性(polymorphism) 多态性是考虑在不同层次的类中&#xff0c;以及在同一类中&#xff0c;同名的成员函数之间的关系问题。 函数的重载&…

弘玑Cyclone2022产品发布会:超级自动化下的流程挖掘——弘观流程智能

近日&#xff0c;在弘玑Cyclone“智无边界&#xff0c;数字未来”发布会上&#xff0c;弘玑Cyclone2022年超级自动化系列产品全新亮相&#xff0c;首席产品官贾岿博士带领产品团队以创新技术对新时代语境下的数字生产力进行了全新解读。 本文将为大家分享本次发布会重磅推出的…

C++之字符串处理函数

字符串操作函数 C语言中几个处理字符串的函数都是以str开头,处理时默认遇到\0结束操作 这些字符串函数都使用了下面这个头文件: #include <string.h> 测量字符串的长度strlen 函数原型 size_t strlen(const char *s) //s指需要测量的字符串首元素地址注意,测量时不计…

建筑设计中,如何快速获得场地的等高线图?

等高线指的是地形图上高程相等的相邻各点所连成的闭合曲线。把地面上海拔高度相同的点连成的闭合曲线&#xff0c;并垂直投影到一个水平面上&#xff0c;并按比例缩绘在图纸上&#xff0c;就得到等高线。&#xff08;来自百度百科的定义&#xff09; 图新地球软件&#xff0c;…

YOLOS

太多了 yolo v x 现在又s了 Transformer能否从纯序列到序列的角度执行2D目标级识别&#xff0c;而对2D空间结构知之甚少&#xff1f;为了回答这个问题&#xff0c;今天就展示了“You Only Look at One Sequence” (YOLOS)&#xff0c;这是一系列基于朴素视觉变换器的目标检测模…

磨金石教育摄影技能干货分享|古风人像修图与调色技巧

上一篇文章我们介绍了古风人像的拍摄技巧&#xff0c;这期我们再来了解一下后期修图与调色的技巧。 一、修 饰 皮 肤 首先我们把拍好的照片拖到PS里。 1、ctrlj复制一个图层。然后选择污点修复画笔把脸部瑕疵去掉&#xff0c;嘴巴部位使用的是修复画笔。这样我们可以看到人像…

pyenv的安装与简单使用

一、pyenv是什么&#xff1f; pyenv 是 python 的 多环境管理 工具&#xff0c;可以安装多个版本的 python&#xff0c;并为 全局 或 单个应用 设置指定版本 二、pyenv的安装 2.1 下载 pyenv 压缩包 压缩包下载地址&#xff1a;https://github.com/pyenv-win/pyenv-win#rea…

测开 - 自动化测试selenium(WebDriver API) - 细节狂魔

文章目录回顾什么是驱动&#xff1f;驱动的工作原理是什么&#xff1f;一个简单的 Web自动化 演示1、定位元素的方法 - 只介绍两种最常使用的2、元素的操作3、等待3.1、强制等待强制等待的优点 && 缺点3.2、隐式等待隐式等待的优缺点3.3、显示等待显示等待的优缺点&…

五种方法帮你解决电脑内存占用大的问题

有用户反映自己的电脑什么都没开&#xff0c;但是运行内存显示占用90%以上&#xff0c;这是什么情况&#xff1f;运行内存占用大&#xff0c;直接影响了用户的使用体验&#xff0c;下面小编就给大家分享五个解决电脑内存占用大的办法吧。 方法一&#xff1a; 1、右键【我的电脑…

C++ —— 模拟实现vector和迭代器失效

目录 1.成员变量的设计 2.迭代器以及接口设计 3.容量接口 4.reserve的设计 5.resize的设计 6.尾插尾删的设计 7.构造、析构函数 8.运算符重载 9.insert接口设计与迭代器失效 10.erase的设计和迭代器失效 11.双层深拷贝问题 12.完整代码 1.成员变量的设计 成员变量…

Stream流、FiLe和IO流、

package com.streamdemo; import java.util.ArrayList; import java.util.List; /*** 体验Stream流** 创建一个集合&#xff0c;存储多个字符串元素* "张三丰","张无忌","张翠山","王二麻子","张良","谢广坤"** 把…

【Java八股文总结】之面试题(一)

文章目录面试题1、说一下ArrayList和LinkedList区别2、说一下HashMap的Put方法3、ThreadLocal4、说一下JVM中&#xff0c;哪些是共享区&#xff0c;哪些可以作为gc root?5、如何排查项目中遇到的JVM问题?6、如何查看线程死锁?7、线程之间如何进行通讯的?8、介绍一下Spring&…

分布式全局唯一 ID生成器(百度UidGenerator)

文章目录为什么要使用全局ID生成器&#xff1f;使用UUID作为主键&#xff1f;使用数据库主键自增&#xff1f;UidGenerator简介雪花算法snowflakeSpringBoot整合百度UidGenerator为什么要使用全局ID生成器&#xff1f; 在分库分表中必定会面临着一个问题&#xff0c; 就是如何…

steam搬砖项目怎么样

大家好&#xff0c;我是阿阳 Steam搬砖就是利用一些技巧和经验去Steam购买一些低价格商品&#xff0c;我们低价拿到道具&#xff0c;再以低于国内市场价的价格销售&#xff0c;保持了发货的稳定性和速度&#xff0c;赚取了利润。 如果是以前有人给我安利这种看着就不靠谱的赚…

scrapy 使用FilesPipeline和ImagesPipeline

除了爬取文本&#xff0c;我们可能还需要下载文件、视频、图片、压缩包等&#xff0c;这也是一些常见的需求。scrapy提供了FilesPipeline和ImagesPipeline&#xff0c;专门用于下载普通文件及图片。两者的使用方法也十分简单&#xff0c;首先看下FilesPipeline的使用方式。 Fi…