DataGridView控件使用 DataSource绑定数据源时,不需要目标数据源对象实现 INotifyPropertyChanged接口,因为 DataGridView 是通过数据绑定来显示数据的,它会自动侦听数据源的变化并刷新界面以反映这些变化。
Form1
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 WindowsFormsApp1
{
public partial class Form1 : Form
{
private MainViewModel mainViewModel;
public Form1()
{
InitializeComponent();
mainViewModel = new MainViewModel();
InitializeUI();
}
private void InitializeUI()
{
FlowLayoutPanel flowLayoutPanel = new FlowLayoutPanel();
flowLayoutPanel.FlowDirection=FlowDirection.LeftToRight;
flowLayoutPanel.Dock=DockStyle.Fill;
this.Controls.Add(flowLayoutPanel);
Label label = new Label();
flowLayoutPanel.Controls.Add(label);
label.DataBindings.Add("Text", mainViewModel, "Message");
TextBox readOnlyTextBox = new TextBox();
readOnlyTextBox.ReadOnly = true;
readOnlyTextBox.DataBindings.Add("Text", mainViewModel, "Message");
flowLayoutPanel.Controls.Add(readOnlyTextBox);
TextBox textBox = new TextBox();
textBox.TextChanged += textBox1_TextChanged;
flowLayoutPanel.Controls.Add(textBox);
}
private void textBox1_TextChanged(Object sender, EventArgs e)
{
TextBox textBox=sender as TextBox;
if(textBox != null)
{
mainViewModel.Message = textBox.Text;
}
}
}
}
Model
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WindowsFormsApp1
{
public class MainModel
{
public string Message { get; set; }
}
}
ViewModel
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
namespace WindowsFormsApp1
{
internal class MainViewModel:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private MainModel mainModel;
public MainViewModel()
{
this.mainModel = new MainModel();
}
public string Message
{
get { return mainModel.Message; }
set { mainModel.Message = value;OnPropertyChanged("Message"); }
}
}
}