【问题标题】:Issue of propertyChanged update for all subproperty in a class in winformwinform类中所有子属性的propertyChanged更新问题
【发布时间】:2017-03-29 07:49:02
【问题描述】:

我实现了一个模型类,并希望在修改对象时为所有子属性引发 PropertyChanged 事件。但我发现它不起作用。当我按下按钮时,标签的文本没有改变。我错过了什么吗?我从 MSDN 得到这个 -“PropertyChanged 事件可以指示对象上的所有属性都已通过使用 null 或 String.Empty 作为PropertyChangedEventArgs 中的属性名称。” 平台是.net framework 4.0和VS2015

   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 中的绑定工作原理,但 this question 可能会有所帮助。
  • @CharlesMager 谢谢。很有帮助

标签: c# winforms inotifypropertychanged


【解决方案1】:

您的问题是您在Model.data 上的绑定,但稍后为其分配一个新值。
因此,被绑定监控的实例不再被使用。

你有两个选择:

第一个:不要创建新的User,只需将其更改为Name

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

或者,如果您确实需要同时支持大小写(创建和分配),那么您必须将绑定更改为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");
}

所以,这将在数据上创建一个PropertyChanged,如果data.Name 已更改,那么如果data 属性本身已为set

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 2011-04-03
    • 2019-11-07
    • 2021-03-10
    • 2023-03-23
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 2016-08-30
    相关资源
    最近更新 更多