【问题标题】:Subscribing to PropertyChangedEventHandler in Winforms在 Winforms 中订阅 PropertyChangedEventHandler
【发布时间】:2015-09-08 09:13:29
【问题描述】:

在以下示例中,RaisePropertyChanged() 中的临时变量始终为空。如何订阅活动?

using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
using System.Runtime.CompilerServices;
using System.Text;

namespace TestProject.Module.BusinessObjects
{
    public class ContactPerson : INotifyPropertyChanged
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        [NotMapped]
        public string PersonFullName
        {
            set
            {
                if (PersonFullName != value)
                {
                    var stringArray = value.Split();
                    var firstIndex = 0;
                    var lastIndex = stringArray.Length - 1;

                    if (lastIndex >= firstIndex)
                    {
                        FirstName = stringArray[firstIndex];
                    }
                    if (lastIndex > firstIndex)
                    {
                        LastName = stringArray[lastIndex];
                    }
                    RaisePropertyChanged();
                }
            }
            get
            {
                var sb = new StringBuilder();

                sb.Append(FirstName);
                sb.Append(" ");

                sb.Append(LastName);

                var stringArray = sb.ToString().Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
                var s = string.Join(" ", stringArray);

                return s;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public ContactPerson Clone()
        {
            var obj = new ContactPerson { FirstName = FirstName, LastName = LastName };

            return obj;
        }

        public override string ToString()
        {
            return PersonFullName;
        }

        protected void RaisePropertyChanged([CallerMemberName] string propertName = "")
        {
            var temp = PropertyChanged;
            if (temp != null)
            {
                temp(this, new PropertyChangedEventArgs(propertName));
            }
        }
    }
}

从阅读This question 看来,PropertyChanged 尚未被订阅。如何进行此订阅?

【问题讨论】:

    标签: winforms .net-4.5 inotifypropertychanged


    【解决方案1】:

    像这样:

        private void Form1_Load(object sender, EventArgs e)
        {
            ContactPerson p = new ContactPerson();
            p.PropertyChanged += P_PropertyChanged;
        }
    
        private void P_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            throw new NotImplementedException();
        }
    

    编辑:扩展示例代码:

    public partial class Form1 : Form
    {
        ContactPerson p;
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            p = new ContactPerson();
            p.PersonFullName = "Mary Jane";
            p.PropertyChanged += P_PropertyChanged;
    
            label1.Text = p.PersonFullName;
    
            // If you use databinding instead, you get the same result in this case.
            //label1.DataBindings.Add(new Binding("Text", p, "PersonFullName"));
        }
    
        private void P_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            label1.Text = p.PersonFullName;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            p.PersonFullName = "John Doe";
        }
    }
    

    【讨论】:

    • 啊,所以订阅发生在表单加载中。但我为什么要抛出 NonImplementedException?
    • 订阅可以在您需要时进行。 Load 事件只是这个简单示例的一个方便的地方。抛出的异常只是 Visual Studio 插入的默认存根代码,您可以将其替换为 MessageBox.Show("Message here!"),例如,或者您希望在实际代码中执行的任何操作。
    • 自我说明。需要为设置属性的业务对象实现 INotifyPropertyChanged。因此,我应该将它放在我的 Invoice 类而不是我的 Contact 类中。此外,我应该调用 NotifyPropertyChanged 方法而不是 RaisePropertyChanged - 以节省我自己的困惑。
    • 我想说INotifyPropertyChanged 必须为属性所属的业务对象实现。如果一个业务对象中的属性可能由多个其他业务对象设置,会发生什么情况?你打算在所有这些中实现INotifyPropertyChanged 吗?是的,约定似乎是NotifyPropertyChanged
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    相关资源
    最近更新 更多