2017-03-29 7 views
0

モデルクラスを実装し、オブジェクトが変更されたときにすべてのサブプロパティの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"); 
     } 
    } 
} 
+2

'Model.data'にバインドしています。つまり、その時点の' data'の特定のインスタンスです。これは決して変化しません。 Winformsでバインディングがどのように機能するのかよくわかっていませんが、[この質問](http://stackoverflow.com/questions/8894103/does-data-binding-support-nested-properties-in-windows-forms)助けて。 –

+0

@CharlesMagerありがとうございます。それは多くを助ける – William

答えて

0

であるあなたの問題は、あなたがModel.dataに結合ということですが、後に、それを新しい値を割り当てます。
したがって、バインディングによって監視されているインスタンスは、これ以上使用されません。

あなたは2つのオプションました:

まず1:あなたは本当にケース(作成とassigmentの両方をサポートする必要がある場合は、

private void button1_Click(object sender, EventArgs e) 
{ 
    Model.data.Name = "test1"; 
} 

または:ちょうどそれがNameだ変更、新しいUserを作成していないが)、その後、あなたはModelへの結合を変更し、data.Nameからテキストを取らなければならない:

label1.DataBindings.Add("Text", Model, "data.Name", false, 
         DataSourceUpdateMode.OnPropertyChanged); 

そして、これまでModelUser財産のset一部:

set 
{ 
    SetField(ref m_data, value, "data"); 
    this.data.PropertyChanged += (sender, args) => this.OnPropertyChanged("data"); 
} 

dataプロパティ自体はset

されている場合 data.Nameがよく、変更されているのであれば、これは、データの PropertyChangedを作成します。
+0

根本原因を指摘していただきありがとうございます – William

関連する問題