在Winform工程中通過nuget安裝Fody.PropertyChanged,安裝完成後,會自動引入文件FodyWeavers.xml
如果沒有引入,則手動新建一個,內容如下:
<?xml version="1.0" encoding="utf-8"?>
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<PropertyChanged />
</Weavers>
Person類如下,實現了INotifyPropertyChanged事件:
class Person : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
//private string name;
//private int age;
//private string address;
//private bool sex;
public string Name { get ; set ; }
public int Age { get ; set; }
public string Address { get ; set; }
public bool Sex { get; set; }
}
窗口Form1類的Load事件和button Click事件處理函數如下:
Person p;
private void Form1_Load(object sender, EventArgs e)
{
p = new Person() { Name = "張三", Age = 20, Address = "廣州市黃埔區", Sex = true };
textBox1.DataBindings.Add("Text", p, "Name");
}
private void button1_Click(object sender, EventArgs e)
{
List<string> ls = new List<string>() {
"張三", "李四", "王五", "趙六","Leo","Jacky","LiLei" };
Random r = new Random();
p.Name = ls[r.Next(0, 7)];
}
界面如下:
期望效果:
點擊按鈕,隨機切換名稱,並在textbox中顯示。
問題:
VS2017,.net framework爲4.6.1,Fody.PropertyChanged版本爲2.5.0,點擊按鈕,沒有反應。
使用ILSpy反編譯生成的exe,查看Person類,Fody.PropertyChanged並沒有將propertyChanged事件注入到Person類中。
解決:
猜測可能爲propertyChanged的版本不對。將原版本卸載,重新安裝Fody.PropertyChanged 2.6.0後成功實現期望的效果。
反編譯.exe查看Person類,也被成功注入propertyChanged事件。
以後通過使用Fody.PropertyChanged,只要讓model實現INotifyPropertyChanged接口,並在控件界面的Load事件中,將控件屬性綁定model屬性,即可實現雙向綁定效果。