gpt4 book ai didi

c# - 当 WPF DataGrid 选择不可见时,INotifyPropertyChanged 出现空引用异常?

转载 作者:太空宇宙 更新时间:2023-11-03 21:29:30 26 4
gpt4 key购买 nike

我有一个 DataGrid 控件,用户可以在其中选择多个项目。选择项目并按下按钮后,我遍历每个项目并编辑属性。更改此属性时,将触发 INotifyPropertyChanged 事件。一切都很好。但是我注意到,如果我选择两个或多个项目并滚动,使其中一个项目完全不可见,然后然后按下按钮,程序将崩溃并给出NotifyPropertyChanged() 方法中的空引用异常告诉我 PropertyChangedEventHandler 为空。如果我从属性的 setter 中删除 NotifyPropertyChanged() 调用,代码将正常工作,所以现在这就是我正在做的,但为什么会发生这种情况?如果我只选择了一个项目,无论滚动位置如何,它都会按预期工作。

在我实现了 INotifyPropertyChanged 接口(interface)的模型类中,我有这些:

    public event PropertyChangedEventHandler PropertyChanged;
// ...
public bool IsScheduled
{
get { return isScheduled; }
set { isScheduled = value; NotifyPropertyChanged(self.ToString()); }
}
// ...
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

我在 ViewModel 的其他地方进行了这个触发错误的简单调用:

process.IsScheduled = true;

如果我在发生错误时检查所选值列表的值,则会检测到所有所选项目。当它们不可见时,事件似乎发生了一些事情。

为什么项目在 View 中的可见性会影响事件处理程序是否为空?

最佳答案

像这样更改您的代码:

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void NotifyPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}

始终检查 null,因为如果没有附加事件处理程序,它将抛出 NullReferenceException除此之外在引发事件时,您应该始终使用临时变量,因为任何对象都可以随时向其添加/删除处理程序。

编辑:

根据您的 .NET Framework 版本,您还可以改进 INotifyPropertyChanged 实现

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void NotifyPropertyChanged([CallerMemberName] string propertyName = "" )
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}

然后只需使用 NotifyPropertyChanged(); 进行通知,而无需将属性名称显式传递给方法,因为 [CallerMemberName] 会自动为您提供调用者的姓名。

这(可能)会导致代码中因拼写错误或更改的属性名称而导致的键入次数减少和错误空间减少。

关于c# - 当 WPF DataGrid 选择不可见时,INotifyPropertyChanged 出现空引用异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25029522/

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