我会将一个对象传递给构造函数。包含一些属性的对象,当设置属性时,它将向所有侦听器触发一个事件,然后它们可以更新他们的屏幕。这种方法的优点是,Form2 不依赖于 Form1(解耦)。只要调用者传递一个有效的 DataObject,Form2 仍然可以被 Form3 重用。
这是一个如何使用 INotifyPropertyChanged 的示例
I have 2 forms.
- form1 has a TextBox and two buttons (one is Set Title property, the other is open form2)
- form2 has a Label, which is only showing the property.
So form1 set the property of the data object, form2 listens to the propertychanged event.
public partial class Form1 : Form
{
private readonly DataObject _dataObject = new DataObject();
public Form1()
{
InitializeComponent();
}
private void buttonOpenForm2_Click(object sender, EventArgs e)
{
// pass the DataObject into the constructor.
var form2 = new Form2(_dataObject);
form2.Show();
}
private void buttonSetTitle_Click(object sender, EventArgs e)
{
_dataObject.Title = textBox1.Text;
}
}
public partial class Form2 : Form
{
private DataObject _dataObject;
// here the dataobject is passed to this form
public Form2(DataObject dataObject)
{
InitializeComponent();
_dataObject = dataObject;
_dataObject.PropertyChanged += DataObject_PropertyChanged;
// deregister the event on close
FormClosed += (s, ee) => _dataObject.PropertyChanged -= DataObject_PropertyChanged;
UpdateTitle();
}
// a method responsible for updating the gui.
private void UpdateTitle() =>
label1.Text = _dataObject.Title;
private void DataObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case nameof(DataObject.Title):
UpdateTitle();
break;
}
}
}
public class DataObject : INotifyPropertyChanged
{
private string _title;
public string Title
{
get { return _title; }
set
{
_title = value;
// here the event is fired.
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Title)));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}