モデルクラスを実装し、オブジェクトが変更されたときにすべてのサブプロパティのPropertyChangedイベントを発生させたいとします。しかし、私はそれが動作していないことがわかった。ボタンを押すと、ラベルのテキストは変更されません。何かが見つからないのですか?MSDNの"PropertyChangedイベントは、オブジェクトのすべてのプロパティがnullまたはString.Emptyをプロパティとして使用して変更されたことを示しますPropertyChangedEventArgsの名前です。 " プラットフォームは、.NET Framework 4.0とVS2015winformのクラス内のすべてのサブプロパティに対するpropertyChangedの更新
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Model = new Model()
{
data = new User()
{
Name = "test"
}
};
label1.DataBindings.Add("Text", Model.data, "Name", false, DataSourceUpdateMode.OnPropertyChanged);
}
private Model model;
public Model Model
{
get
{
return this.model;
}
set
{
model = value;
}
}
private void button1_Click(object sender, EventArgs e)
{
User temp = new User()
{
Name = "test1"
};
Model.data = temp;
}
}
public class NotifyPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
protected bool SetField<T>(ref T field, T value, string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
OnPropertyChanged(null);
return true;
}
}
public class Model : NotifyPropertyChanged
{
private User m_data;
public User data
{
get { return m_data; }
set
{
SetField(ref m_data, value,"data");
}
}
}
public class User : NotifyPropertyChanged
{
private string name;
public string Name
{
get { return this.name; }
set
{
SetField(ref name, value, "Name");
}
}
private string tel;
public string Tel
{
get { return this.tel; }
set
{
SetField(ref tel, value, "Tel");
}
}
}
'Model.data'にバインドしています。つまり、その時点の' data'の特定のインスタンスです。これは決して変化しません。 Winformsでバインディングがどのように機能するのかよくわかっていませんが、[この質問](http://stackoverflow.com/questions/8894103/does-data-binding-support-nested-properties-in-windows-forms)助けて。 –
@CharlesMagerありがとうございます。それは多くを助ける – William