首页 > 其他分享 >winform双向绑定如何实现

winform双向绑定如何实现

时间:2023-08-22 16:12:19浏览次数:30  
标签:string 绑定 System public 双向 using ID winform

在使用WinForm编写测试小软件的时候,经常需要把数值通过Textbox显示出来。通常的做法为把改变后的数值显示在textbox上重新显示,需要通过数值重新赋值给相应的textbox.text属性才可显示。这个方法虽然很简单,但是在数值多的时候,这个做法非常麻烦而且不容易维护。那么有没有一种简单的方法,数值改变的时候,同时textbox.text的值也同时改变呢。通过网上查询知道C#还提供INotifyPropertyChanged接口实现了这个功能,用于数据绑定时非常的方便,有助于精简代码。

NotifyPropertyChanged接口官方解释为“Notifies clients that a property value has changed.”即通知客户端属性值已更改之意。这个说法比较模糊,通过参考官方的例子,简单实现了这一功能。

一、添加类库文件,声明类并定义属性
在解决方案资源管理器中右键项目-->添加类,为项目增加一个作为“绑定源”的数据的类。名字为Syspara.cs。Syspara由自己定义。这其实就是界面的后台数据仓库。一个界面可以建一个类,一个界面上不同的控件可以建不同的类,多个界面也可以使用一个类。在绑定时选择绑定那一个类。然后在类库文件中声明类并定义属性。对于TextBox控件,希望输入值改变后数据仓库同时变化,要加一些语句。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;

namespace LoRa传输设备设置软件
{
class Syspara : INotifyPropertyChanged
{
/// <summary>
/// 设备ID
/// </summary>
private string _devId;

/// <summary>
/// 网络ID
/// </summary>
private string _netId;

/// <summary>
/// 设备ID
/// </summary>
public string DevId
{
set { _devId = value;}
get { return _devId; }
}

/// <summary>
/// 网络ID
/// </summary>
public string NetId
{
set { _netId = value; }
get { return _netId; }
}
}
}

为了使用INotifyPropertyChanged接口,需要添加using System.ComponentModel

二、在类中实现INotifyPropertyChanged接口

这是一个方法,里面没有用户要编的代码。OnPropertyChanged方法引发PropertyChanged事件。PropertyChanged 事件的PropertyChangedEventArgs参数指定了发生改变的属性的名称。该值作为参数传给OnPropertyChanged方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;

namespace TEST
{
class Syspara : INotifyPropertyChanged
{
/// <summary>
/// 设备ID
/// </summary>
private string _devId;

/// <summary>
/// 网络ID
/// </summary>
private string _netId;

/// <summary>
/// 设备ID
/// </summary>
public string DevId
{
set { _devId = value; }
get { return _devId; }
}

/// <summary>
/// 网络ID
/// </summary>
public string NetId
{
set { _netId = value; }
get { return _netId; }
}


public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var propertyChanged = this.PropertyChanged;
if (propertyChanged != null)
{
propertyChanged(this,new PropertyChangedEventArgs(propertyName));
}
}
}
}

同时,修改所有属性的set访问器,指定在值被修改时都调用OnPropertyChanged方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;

namespace TEST
{

class Syspara : INotifyPropertyChanged
{


/// <summary>
/// 设备ID
/// </summary>
private string _devId;

/// <summary>
/// 网络ID
/// </summary>
private string _netId;

/// <summary>
/// 设备ID
/// </summary>
public string DevId
{
set
{
_devId = value;
OnPropertyChanged("DevId");
}
get { return _devId; }
}

/// <summary>
/// 网络ID
/// </summary>
public string NetId
{
set
{
_netId = value;
OnPropertyChanged("NetId");
}
get { return _netId; }
}


public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var propertyChanged = this.PropertyChanged;
if (propertyChanged != null)
{
propertyChanged(this,new PropertyChangedEventArgs(propertyName));
}
}
}
}

三、属性路径绑定

        Winfrom的界面代码中进行数据绑定。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace TEST
{
public partial class Form1 : Form
{
/// <summary>
/// 系统参数
/// </summary>
Syspara syspara;

public Form1()
{
InitializeComponent();
}

/// <summary>
/// 窗口加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
syspara = new Syspara();

//参数初始化
syspara.NetId = "1";

//数据绑定A
txtDevId.DataBindings.Add("Text", syspara, "DevId");
txtNetId.DataBindings.Add("Text", syspara, "NetId");
}

}
}

        以上三个步骤就完成了数据的双向绑定功能,是不是很方便,很简单。后面若是增加新的属性再按照第二、第三步重新绑定数据即可。

————————————————
版权声明:本文为CSDN博主「freedompoi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/freedompoi/article/details/118191170

标签:string,绑定,System,public,双向,using,ID,winform
From: https://www.cnblogs.com/KevinSteven/p/17648790.html

相关文章

  • bfs 双向宽搜
     1、迷宫问题,找最短路:可以同时从起点和终点进行bfs,两个方向搜索的新节点分别存在不同的队列中的,若新节点在对面的状态集合中出现过,说明相遇了。2、很多bfs问题,都可以用双向宽搜,提高效率。3、分油问题,能不能用双向宽搜呢?3个无刻度的油瓶的容量是1073,其中分别有油10,0,0......
  • vue_中文输入法情况下, 输入框v-model绑定值中没有输入值但却触发input事件
    今天写的一个搜索框,要求输入字符时不作处理,直到用户点击搜索按钮时才执行搜索逻辑;当用户将搜索框文本删除至空字符串时,执行一次无搜索值的搜索逻辑,用于将表格数据恢复至无筛选;在这个功能上我想当然地使用了input事件用于触发输入事件,但是被测试出bug:当输入法是......
  • WPF绑定Enum到RadioButton
    将枚举型的数据类型绑定到单选按钮的IsChecked属性中,可以避免定义多个bool类型与之进行绑定,尤其是枚举类型较多时候,对bool对象的维护会更加复杂。1、定义枚举类型及值转换器internalenumGender{[Description("男")]Male,[Description("女")]Female,[Descri......
  • inno setup 6 打包C# winform 程序安装包
    注:checkablealone"选中"意思unchecked"非选中"意思图标选择:IconFilename:"{app}\Images\SysIcon.ico"#defineMyAppName"LuoCore"#defineMyAppVersion"1.5"#defineMyAppPublisher"LuoCore"#define......
  • 剑指 Offer 36. 二叉搜索树与双向链表
    本题比较重要的有两点:1.一般认为有序的二叉搜索树,都是中序遍历。2.中序遍历的递归顺序,得到的就是排好序的,就是链表的顺序,因此只需管遍历的过程中的链表指向即可。classSolution{public://pre将来指向尾节点,head指向头节点Node*pre=nullptr,*head=nullptr;......
  • 微信小程序动态绑定class样式类(三木运算)
    直接上代码,循环列表,根据选中状态显示不同的样式,active就是你在wxss文件里面创建的类名<view  class="{{item.select ? 'active':''}}" wx:for="{{itemList}}" wx:key="{{item.id}}">   {{item.name}}</view>在一个标签的class里添加{{}}模板语法,模板......
  • C#.NET WINFORM 缓存 System.Runtime.Caching MemoryCache
    C#.NETWINFORM缓存 System.Runtime.CachingMemoryCache 工具类:usingSystem;usingSystem.Runtime.Caching;namespaceCommonUtils{///<summary>///基于MemoryCache的缓存辅助类///</summary>publicstaticclassMemoryCacheHelper{......
  • python使用netmiko连接交换机绑定mac
    环境背景python3.8,华为交换机每次手动登录交换机再进行绑定操作,太过机械化啊,本着懒人原则,写一个脚本真不是事情脚本fromnetmikoimportConnectHandlerimporttimedefbing_mac(mac):sw_ip='10.10.10.10'#交换机ipusername='admin'#交换机账号......
  • WPF ListBox 控件绑定 Binding
     当我们需要用到循环的列表内容,并且模板化程度高的时候,建议使用 ListBox 来做绑定。XAML:<Window.DataContext><local:VMTempTest/></Window.DataContext><StackPanelMargin="10,0,0,50"Orientation="Vertical"><TextBlockText="ListBo......
  • WPF的5种绑定模式(Mode)
    一:WPF的5种绑定模式(Mode)WPF的绑定模式(mode)是枚举的枚举值共有5个1:OneWay(源变就更新目标属性)2:TwoWay(源变就更新目标并且目标变就更新源)3:OneTime(只根据源来设置目标,以后都不会变)4:OneWayToSource(与OneWay相反)5:Default(可以单向或双向,是靠被值定的源或目标是否有get或set来指定的)所......