C# 了解PropertyChanged机制的工作原理(工作流)

C# 了解PropertyChanged机制的工作原理(工作流),c#,events,C#,Events,澄清: 1.-我不知道这篇文章在英语或编程俚语中是否有特定的名称或单词引用,所以这篇文章可能是重复的,因为我无法查看 2.-我对这东西完全是新手,我从来没有使用过处理器,所以这是问题的一部分 我试图理解NotifyPropertyChanged机制是如何工作的。基于:,以实例为重点。(我正在用西班牙语看,上面你可以把它改成英文原版,如果它不自动改变的话 现在,我将提取让我感到疑惑的主要代码,并尝试对其进行分析。希望您能告诉我哪里(如果存在)我错了,以及我不理解的地方。让我们关注实现接口的类。 /

澄清: 1.-我不知道这篇文章在英语或编程俚语中是否有特定的名称或单词引用,所以这篇文章可能是重复的,因为我无法查看

2.-我对这东西完全是新手,我从来没有使用过处理器,所以这是问题的一部分

我试图理解NotifyPropertyChanged机制是如何工作的。基于:,以实例为重点。(我正在用西班牙语看,上面你可以把它改成英文原版,如果它不自动改变的话

现在,我将提取让我感到疑惑的主要代码,并尝试对其进行分析。希望您能告诉我哪里(如果存在)我错了,以及我不理解的地方。让我们关注实现接口的类。

// This is a simple customer class that 
// implements the IPropertyChange interface.
public class DemoCustomer : INotifyPropertyChanged
{
    // These fields hold the values for the public properties.
    private Guid idValue = Guid.NewGuid();
    private string customerNameValue = String.Empty;
    private string phoneNumberValue = String.Empty;

    public event PropertyChangedEventHandler PropertyChanged;

    // This method is called by the Set accessor of each property.
    // The CallerMemberName attribute that is applied to the optional propertyName
    // parameter causes the property name of the caller to be substituted as an argument.
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    // The constructor is private to enforce the factory pattern.
    private DemoCustomer()
    {
        customerNameValue = "Customer";
        phoneNumberValue = "(312)555-0100";
    }

    // This is the public factory method.
    public static DemoCustomer CreateNewCustomer()
    {
        return new DemoCustomer();
    }

    // This property represents an ID, suitable
    // for use as a primary key in a database.
    public Guid ID
    {
        get
        {
            return this.idValue;
        }
    }

    public string CustomerName
    {
        get
        {
            return this.customerNameValue;
        }

        set
        {
            if (value != this.customerNameValue)
            {
                this.customerNameValue = value;
                NotifyPropertyChanged();
            }
        }
    }

    public string PhoneNumber
    {
        get
        {
            return this.phoneNumberValue;
        }

        set
        {
            if (value != this.phoneNumberValue)
            {
                this.phoneNumberValue = value;
                NotifyPropertyChanged();
            }
        }
    }
那么,我能理解什么?(或者相信它)

发件人:

public event PropertyChangedEventHandler PropertyChanged;
1.-PropertyChanged是一种方法。当触发PropertyChanged事件时,将执行该方法

怀疑:但这种方法从未实施过

发件人:

2.-NotifyPropertyChanged是一个方法。由我们创建,可以有我们想要的任何名称。当属性被修改时,我们将启动此方法

问题:此方法是否触发属性更改事件

怀疑:对我来说,正如我在那里看到的,没有人启动这个事件,但是我们创建的方法是在触发时启动的。但是因为它不触发,我们直接启动这个方法,而不是它

混合最终思考:NotifyPropertyChanged使用Hanlder抛出事件,以便被“上级实体”(示例代码中的绑定源)捕获,它接收修改的属性以更新它。然后,如果我想知道哪些元素/类可以感知此类事件,我该怎么办

我认为最后一个是正确的,但由于我不是专家,而是在试图理解它和写这个问题时的思考,我希望你纠正我

非常感谢

已更新

非常感谢大家!那么,我可以用我想要的方法来参加这次活动吗?我已经试过了:

objetos[usados] = new ItemDB();
objetos[usados].PropertyChanged += mensaje();
与:

但是VS说:

错误1 Ninguna sobrecarga对应于“mensaje”con el“System.component model.property changedeventhandler”delegado

翻译成:

错误1与“mensaje”对应的任何重载都与“System.ComponentModel.PropertyChangedEventHandler”委托不匹配


既然我的事件是用一个字符串arg给出的,并且
mensaje
作为参数和字符串接收,它为什么不起作用呢?

首先,您是对的,
NotifyPropertyChanged
是一个用户定义的函数。它缩进只是为了避免在使用更多属性时逻辑加倍。其次,
NotifyPropertyChanged
不会在事件触发时执行,反之亦然;只要调用了
NotifyPropertyChanged
,事件就会被触发。如果绑定了合适的控件,那么它将消耗事件并可能更新自身。该事件可以被视为其他代码可以注册回调的出口。进一步或者,.NET 4.5引入了属性
CallerMemberName
。不使用它也可以获得相同的结果,但是对于
NotifyPropertyChanged
的每次调用,都必须明确给出属性的名称。

我建议您在C中查找事件委托,以了解更多信息阅读

public event PropertyChangedEventHandler PropertyChanged;
PropertyChanged是一个事件处理程序,它是一个委托。其他代码可以在这里注册,并在调用委托时执行

因此,INotifyPropertyChanged的结果是:

某些代码(可能是Xaml中的绑定)为PropertyChanged事件注册:

yourobject.PropertyChanged += MethodThatShouldBeCalledWhenThePropertyChanges;
(这是在某个地方最合适的自动生成,因为它是从xaml生成的,但您也可以手动生成。)

在NotifyPropertyChanged方法中,执行事件委托。 它只执行添加到事件中的所有方法

因此,要回答您的问题:

是的,NotifyPropertyChanged中的代码“触发”事件。它调用添加到事件中的每个方法

任何代码都可以注册事件

自更新之日起

我再次建议向代表们朗读

您可以将委托视为方法接口。它定义了方法必须采用特定的参数类型来匹配委托

PropertyChanged的类型采用对象和PropertyChangedEventArgs参数

因此,任何类似的方法都是合适的:

void MethodName(
Object sender,
PropertyChangedEventArgs e
)

PropertyChanged
是一个事件处理程序,而不是一个方法。它实际上存储委托(函数,如果您愿意)和调用(实际上是
调用
'ing)的列表
PropertyChanged
将调用所有已注册的委托。您可以按以下方式注册委托:
customer.PropertyChanged+=OnCustomerChanged;
。然后,当您从类内部调用
PropertyChanged
时,将调用
OnCustomerChanged
。谢谢Pieter!更新了一点!
PropertyChange>d
的类型为
PropertyChangedEventHandler
。如果查看其定义,您将看到它是一个包含两个参数的委托:一个
对象(发送方)和一个
属性changedeventargs
(有关已更改属性的信息)但是,你的
mensaje
方法只需要一个
string
参数,因此它不匹配。两个都谢谢!我会读到关于事件的内容。再次感谢你的解释Pieter^^^@Sinatr为什么这么粗鲁?如果他不知道,那么他可以要求。这样其他人就可以把他引向具体的主题。谢谢你的帮助
yourobject.PropertyChanged += MethodThatShouldBeCalledWhenThePropertyChanges;
void MethodName(
Object sender,
PropertyChangedEventArgs e
)