Winform的界面数据绑定需要手动绑定,比如下面的代码:
Model model;
public Form1()
{
InitializeComponent();
model = new Model();
label1.DataBindings.Add("Text", model, "ID");
ListBox lb = new ListBox();
}
private void button1_Click(object sender, EventArgs e)
{
model.ID = DateTime.Now.ToString("mm:ss");
}
Model的实现:
class Model: INotifyPropertyChanged
{
public string ID { set; get; }
public string Name { set; get; }
public event PropertyChangedEventHandler PropertyChanged;
}
实体类像wpf那样,仍然需要实现INotifyPropertyChanged,这里你可以自己去实现,也可以使用PropertyChanged.Fody这样一个AOP框架。这里我用的是Fody,也就是说如果你的Model继承了接口PropertyChanged,那么Fody就会自动帮你生成属性变更通知代码。如果你不知道怎么使用,可以参考下这个项目的git官方项目页面:https://github.com/Fody/PropertyChanged。
如果你没有用Fody,那么你的Model应该这么写:
public class Model: INotifyPropertyChanged
{
private string id;
private string name;
public string ID {
get => id;
set
{
id = value;
OnPropertyChanged("ID");
}
}
public string Name
{
get => name;
set
{
name = value;
OnPropertyChanged("Name");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
当然这里有许多地方可以完善,比如做一下检查,如果没有变更,则不通知,把OnPropertyChanged放到一个父类里面,所有的model都继承这个父类。
Add方法有几个重载方法,它同时可以设置绑定格式:
label1.DataBindings.Add(
"Text",model,"Time",
updateMode:DataSourceUpdateMode.OnPropertyChanged,
formattingEnabled: true,
nullValue:null,formatString:"yyyy/MM");
c#里如果你在传参的时候指定了参数名,那么你的参数可以不用按照顺序填写,就像我上面的代码这样。
wpf里面可以控制绑定方向,即双向,单向等等,这里