如何为属性添加PropertyChanged事件?

Bra*_*ley 0 .net c# winforms

我已经在用户控件内创建了各种属性,并且在访问和编辑它们方面都取得了巨大的成功。我现在正在尝试为更改其中一个属性时引发的许多事件设置事件。我已经尝试了MSDN示例代码来执行此操作(请参阅此处),但是当我尝试构建解决方案时,它给了我这个错误:

严重性代码说明项目文件行抑制状态错误CS0079事件'AbilityScoreDisplay.AbilityTitleChanged'仅出现在+ =或-= DnD字符表C:\ Users \ Bradley beasley \ Documents \ Visual Studio 2019 \ Projects \的左侧DnD字符表\ DnD字符表\ AbilityScoreDisplay.Designer.cs 199有效

我遇到的另一个问题是我正在努力弄清楚如何使该事件出现在Visual Studio 2019设计器属性窗口中。

这是我添加到设计器文件中的代码:

namespace DnD_Character_Sheet
{
    partial class AbilityScoreDisplay : UserControl
    {
        public string AbilityTitle
        {
            get
            {
                return AbiltyTitleLabel.Text;
            }
            set
            {
                AbiltyTitleLabel.Text = value;
                Invalidate();
            }
        }
        public int AbilityModifier
        {
            get
            {
                return Convert.ToInt32(AbilityModifierTextBox.Text);
            }
            private set
            {
                if (value >= 0) AbilityModifierTextBox.Text = String.Format("+{0}", value);
                else AbilityModifierTextBox.Text = value.ToString();
                Invalidate();
            }
        }
        public int AbilityScore
        {
            get
            {
                return Convert.ToInt32(AbilityScoreLabel.Text);
            }
            set
            {
                AbilityModifier = (int)(Math.Floor((double)(value) / 2)) - 5;
                Invalidate();
            }
        }

        private EventHandler onAbilityTitleChanged { get; set; }
        private EventHandler onAbilityScoreChanged { get; set; }

        public event EventHandler AbilityTitleChanged
        {
            add
            {
                onAbilityTitleChanged += value;
            }
            remove
            {
                onAbilityTitleChanged -= value;
            }
        }
        public event EventHandler AbilityScoreChanged
        {
            add
            {
                onAbilityScoreChanged += value;
            }
            remove
            {
                onAbilityScoreChanged -= value;
            }
        }

        protected virtual void OnAbilityTitleChanged(EventArgs e)
        {
            AbilityTitleChanged?.Invoke(this, e);
        }
        protected virtual void OnAbilityScoreChanged(EventArgs e)
        {
            AbilityScoreChanged?.Invoke(this, e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

目的是使每当属性更改时就引发一个事件,以便它可以以控件将要使用的形式在其他地方做其他事情。我可以肯定的是,我错过了一些非常重要的东西,或者代码根本不是那么有效,但是我是第一次学习这种代码,并且我尝试了许多行不通的事情。

任何帮助都将不胜感激:)

Jua*_*anR 5

我认为您会混淆一些概念。让我们一步一步地做。

首先,您需要能够跟踪事件处理程序:

private EventHandler _onAbilityTitleChanged; 
Run Code Online (Sandbox Code Playgroud)

您可以通过公共属性公开此事件:

public event EventHandler AbilityTitleChanged
{
    add
    {
        _onAbilityTitleChanged += value;
    }
    remove
    {
        _onAbilityTitleChanged -= value;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,您需要触发事件,以便所有订阅的处理程序都可以对此事件做出反应。标题更改(设置)时,您可以这样做:

public string AbilityTitle
{
    get
    {
        return AbiltyTitleLabel.Text;
    }
    set
    {
        AbiltyTitleLabel.Text = value;
        //Raising the event!
        _onAbilityTitleChanged?.Invoke(this, new EventArgs());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后其他班级可以订阅您的活动:

var control = new AbilityScoreDisplay();
control.AbilityTitleChanged += SomeHandlerForWhenTitleChanges;

private void SomeHandlerForWhenTitleChanges(object sender, EventArgs e)
{
    //....
}
Run Code Online (Sandbox Code Playgroud)

您可能还需要在INotifyPropertyChanged接口上阅读一些内容。