winform双向绑定如何实现

发布时间 2023-08-22 16:11:09作者: KevinSteven

在使用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