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

Winform 中实现控件与数据的绑定,一方改变另一方同步改变。

1. 目的

用 Winform 想实现控件与后台数据的解耦,但是同样可以做到控件的显示改变时,后台数据同步改变;后台数据修改,控件则同步刷新。

2. 下载引用库

CommunityToolKit.Mvvm

代码中:using CommunityToolkit.Mvvm.ComponentModel;

3. 界面

4. 实现与界面对应的后台数据

创建一个类 ObservableText,要继承 ObservableObject,里面的属性才可以用到 MVVM 的属性变更通知的核心方法 SetProperty。

定义与控件参数绑定的属性:

Input 的Text:TextValue

Label 的 Text:LabelText

ComboBox 的当前 Index:CcbIndex

控件控件属性后台类属性
InputTextTextValue
LabelTextLabelText
ComboBoxSelectedIndexCcbIndex

5. 实现绑定

使用 Control 类都提供的 DataBindings(控件的数据绑定集合),Add 函数:

public Binding Add(string propertyName, object dataSource, string dataMember)

例如 Label 的 Text 绑定:

//Label
lblText.DataBindings.Add("Text", _obserTxt, nameof(_obserTxt.LabelText));

6. 运行测试

(1)改变与控件绑定的后台数据,观察控件显示。 

(2)改变控件显示信息,观察与之绑定的后台数据。

实际上都会改变,即一方改变,另一方同步改变。

7. 完整代码:

using CommunityToolkit.Mvvm.ComponentModel;
using System;
using System.Diagnostics;
using System.Windows.Forms;namespace WindowsFormsApp1
{public partial class Form1 : Form{ObservableText _obserTxt = new ObservableText();public Form1(){InitializeComponent();InitData();SetDataBindings();}private void SetDataBindings(){//TexttxtTest1.DataBindings.Add("Text", _obserTxt, nameof(_obserTxt.TextValue));//LabellblText.DataBindings.Add("Text", _obserTxt, nameof(_obserTxt.LabelText));//ComboBoxccb.DataBindings.Add("SelectedIndex", _obserTxt, nameof(_obserTxt.CcbIndex));}private void InitData(){ccb.Items.Add("Joe");ccb.Items.Add("Jake");ccb.Items.Add("Andy");}private void btnSetText_Click(object sender, EventArgs e){_obserTxt.TextValue += 11.4f;}private void btnSetLabel_Click(object sender, EventArgs e){_obserTxt.LabelText += " World";}private void btnSetComboBox_Click(object sender, EventArgs e){if (_obserTxt.CcbIndex < ccb.Items.Count - 1)_obserTxt.CcbIndex++;else_obserTxt.CcbIndex = 0;}private void btnTest_Click(object sender, EventArgs e){Debug.WriteLine("---------: " + _obserTxt.TextValue + "; " + _obserTxt.CcbIndex);}}public class ObservableText : ObservableObject{private float _textValue = 100.1f;private string _labelText = "Hello";private int _ccbIndex = 0;public float TextValue{get => _textValue;set => SetProperty(ref _textValue, value);}public string LabelText{get => _labelText;set => SetProperty(ref _labelText, value);}public int CcbIndex{get => _ccbIndex;set => SetProperty(ref _ccbIndex, value);}public ObservableText() { }}
}

http://www.dtcms.com/a/310489.html

相关文章:

  • 【Onvif从零实践】02、Onvif 测试工具(ONVIF Device Test Tool)的 安装、使用 教程
  • C++入门自学Day4-- c++类与对象(友元)
  • JavaScript语法树简介:AST/CST/词法/语法分析/ESTree/生成工具
  • 水果忍者经典版:离线版,永久无限制!!
  • IPD数字化的困难与解法
  • 如何在 VMware Workstation 虚拟机中利用 Nvidia 显卡的硬件加速功能
  • 利用 AI 在 iPhone 上实现 App 文本情绪价值评估(下)
  • 浅谈低代码平台涉及的一些技术选型
  • 【BUUCTF系列】[ACTF2020 新生赛]Exec 1
  • 用 Ubuntu 22.04 (Jammy) 的 MongoDB 源
  • Skia-如何渲染文本(上)
  • Android中页面生命周期变化
  • 多人命题系统
  • Qt 开发自动化测试框架搭建
  • 【Open3D】基础操作之三维变换
  • Nginx跨域问题与 MIME 类型错误深度排错指南:解决 MIME type of “application/octet-stream“ 报错
  • 【LeetCode刷题指南】--单值二叉树,相同的树
  • 《人形机器人的觉醒:技术革命与碳基未来》——类人关节设计:柔性驱动革命之液压人工肌肉
  • python中appium
  • 在PyCharm中将现有Gitee项目重新上传为全新项目
  • WordPress 前端显示英文,后台显示中文的设置
  • CH7216A USB Type C上的 DisplayPort 转 HDMI 2.0 转换器【CH7216A-BF】
  • JSON 对象在浏览器中顺序与后端接口返回不一致的问题
  • 基于cygwin或msmy的windows环境下的jupyterlab的C内核搭建
  • Lipschitz连续函数
  • Flutter 替换镜像源
  • 牛客——接头密匙
  • .net依赖注入框架 Autofac和MEF的对比
  • 如何在企业微信中打开外部网页或者自己开发的本地网页
  • vue+ts 基础面试题 (四)