说明:
1.- 我不知道是否具有用英语或编程语引用的特定名称或单词,所以这可能是重复的帖子,因为我看不到它。

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

我正在尝试了解 NotifyPropertyChanged机制如何工作。基于:INotifyPropertyChanged,着重于示例。 (我正在用西类牙语查找它,如果不自动更改,您可以在上方将其更改为原始英语。

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

// 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是一种方法。当 ProperyChanged事件触发时将执行的一个。

怀疑:但是这种方法从未实现过...

从:
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

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

问题:此方法是否触发 ProperyChanged事件

怀疑:对我来说,正如我在那看到的那样,没有人启动此事件,但是我们创建的要在触发时启动的方法。但是由于它不会触发,因此我们直接启动该方法来代替它。

Mixture的最终想法:NotifyPropertyChanged使用Hanlder抛出事件,以便被“高级实体”(示例代码中的绑定(bind)源)捕获,该实体接收经过修改的属性以便可以对其进行更新。然后,如果我想知道哪些元素/类可以知道此类事件,我该怎么办?

我认为这最后一个是正确的,但是由于我不是专家,而是我在尝试理解和编写此问题时的想法,因此,我希望您纠正我。

非常感谢!

更新了

非常感谢大家!然后,我可以用我想要的方法订阅该事件吗?我试过了:
objetos[usados] = new ItemDB();
objetos[usados].PropertyChanged += mensaje();

和:
public async void mensaje(string cadena)
{
    var dlg = new ContentDialog(){
        Title = "My App",
        Content = cadena,
        PrimaryButtonText = "Yes",
        SecondaryButtonText = "No"
    };

    var result = await dlg.ShowAsync();

}

但是,VS说:



已翻译:



为什么它不起作用,因为我的事件是用字符串形式的arg给出的,而mensaje则作为参数和字符串来接收的?

最佳答案

我建议您在C#中查找事件代表以供进一步阅读。

public event PropertyChangedEventHandler PropertyChanged;

PropertyChanged带有一个 EventHandler ,它是一个委托(delegate)。其他代码可以在此处注册并在调用委托(delegate)时执行。

因此,与INotifyPropertyChanged一起发生的事情是:

一些代码(可能是Xaml中的绑定(bind))为PropertyChanged事件注册:
yourobject.PropertyChanged += MethodThatShouldBeCalledWhenThePropertyChanges;

(这是在某处自动生成的,因为它是从xaml自动生成的,但是您也可以手动这样做。)

NotifyPropertyChanged 方法中,将执行事件委托(delegate)。
它只是执行添加到事件中的所有方法。

因此,回答您的问题:

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

任何代码都可以注册事件。

从您的更新开始:

我再次建议阅读与会代表。

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

PropertyChanged的类型为PropertyChangedEventHandler,它带有一个对象和一个PropertyChangedEventArgs参数。

因此,像这样的任何方法都是合适的:
void MethodName(
Object sender,
PropertyChangedEventArgs e
)

关于c# - 了解PropertyChanged机制的工作方式(工作流程),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28043183/

10-12 17:29