gpt4 book ai didi

c# - 处理 OnPropertyChanged

转载 作者:IT王子 更新时间:2023-10-29 04:06:10 25 4
gpt4 key购买 nike

我不太精通基于事件的编程。基本上,我还在摸索着它。我正在尝试设置一些东西,但即使有了教程,我也无法全神贯注。我想做的(用文字)如下:

  1. 我有一个属性更改的数据对象。我在属性的 setter 中注意到这一点,并想引发属性已更改的事件。

  2. 在其他地方(完全不同的类),我想知道这个对象的属性已经改变,并采取一些行动。

现在我确信这是一个很常见的场景,但我的 google-fu 让我失望了。我根本不明白http://msdn.microsoft.com/en-us/library/ms743695.aspx .

我有这个:

public class ChattyClass {
private int someMember;

public event PropertyChangedEventHandler PropertyChanged;

public int SomeMember {
get {
return this.someMember;
}
set {
if (this.someMember != value){
someMember = value;
// Raise event/fire handlers. But how?
}
}
}

public class NosyClass{
private List<ChattyClass> myChatters;

public void addChatter(ChattyClass chatter){
myChatters.add(chatter);
// Start listening to property changed events
}

private void listner(){
// I want this to be called when the PropertyChangedEvent is called
Console.WriteLine("Hey! Hey! Listen! A property of a chatter in my list has changed!");
}
}

我该怎么做才能连接起来?

关于指向我返回链接的评论:

在我看到的例子中:

protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}

我不明白的是:

  • 为什么这不只是调用 PropertyChanged(this, new PropertyCHangedEventArgs(name))
  • 在哪里分配 PropertyChanged?
  • 作业是什么样的?

最佳答案

您必须触发该事件。在 MSDN 上的示例中,他们制作了一个 protected 方法 OnPropertyChanged 来更轻松地处理此问题(并避免重复代码)。

// Create the OnPropertyChanged method to raise the event 
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}

此方法的作用是查看是否分配了事件处理程序(如果未分配而您只是调用它,您将得到一个 NullReferenceException)。如果已分配一个,则调用此事件处理程序。提供的事件处理程序必须具有 PropertyChangedEventHandler 委托(delegate)的签名。这个签名是:

void MyMethod(object sender, PropertyChangedEventArgs e)

其中第一个参数必须是对象类型并表示触发事件的对象,第二个参数包含此事件的实参。在这种情况下,您自己的类会触发事件,从而将 this 作为参数 sender。第二个参数包含已更改的属性的名称。

现在为了能够对事件的触发使用react,您必须为该类分配一个事件处理程序。在这种情况下,您必须在 addChatter 方法中分配它。除此之外,您必须首先定义您的处理程序。在您的 NosyClass 中,您必须添加一个方法来执行此操作,例如:

private void chatter_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
Console.WriteLine("A property has changed: " + e.PropertyName);
}

可以看到,这个方法对应我之前讲解的签名。在第二个参数中,您可以找到更改了哪个参数的信息。最后要做的是添加事件处理程序。现在在你的 addChatter 方法中,你必须分配这个:

public void AddChatter(ChattyClass chatter)
{
myChatters.Add(chatter);
// Assign the event handler
chatter.PropertyChanged += new PropertyChangedEventHandler(chatter_PropertyChanged);
}

我建议您阅读一些有关 .NET/C# 中的事件的内容:http://msdn.microsoft.com/en-us/library/awbftdfh .我认为在阅读/学习之后,您会更加清楚。

您可以找到一个控制台应用程序 here on pastebin如果您想快速测试它(只需复制/粘贴到新的控制台应用程序)。

使用较新版本的 C#,您可以内联对事件处理程序的调用:

// inside your setter
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MyProperty)));

你也可以使用类似 Fody PropertyChanged 的东西自动生成必要的代码(访问他们的 GitHub 页面的链接,带有示例)。

关于c# - 处理 OnPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12034840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com