是否可以使用类似于 auto-属性 ({ get; set; }) 的语法来声明引发 PropertyChanged 事件的 属性?

Is it possible to declare a property raising PropertyChanged event using a syntax similar to an auto-property ({ get; set; })?

我想知道在必须引发 PropertyChanged 事件时如何简化属性的使用。我的意思是,只要您需要引发事件,setter 就必须这样做,因此 属性 不能是自动 属性。这会导致代码的一些复杂性,尤其是当涉及多个属性时,除了简单地引发事件之外没有其他目的:

protected FlowDocument document;
protected bool hyphenation = true;
protected bool optimalParagraphs = true;

public event PropertyChangedEventHandler PropertyChanged;

public FlowDocument Document { get => document; set { document = value; RaisePropertyChanged (); } }
public bool Hyphenation { get => hyphenation; set { hyphenation = value; RaisePropertyChanged (); } }
public bool OptimalParagraphs { get => optimalParagraphs; set { optimalParagraphs = value; RaisePropertyChanged (); } }

// Raise event
protected void RaisePropertyChanged ([CallerMemberName] string propertyName = null) {
    PropertyChanged?.Invoke (this, new PropertyChangedEventArgs (propertyName));
}

复杂性在这部分,每个 属性:

protected FlowDocument document;
public FlowDocument Document { get => document; set { document = value; RaisePropertyChanged (); } }

因为没有可能这样表达:

public FlowDocument Document { get; setAndRaiseEvent; }

网站上的搜索提出了这个类似但不重复的问题:

以目前的 C# 可能性,有没有办法简化原始代码? (我正在扩大任何可能性的范围)。

"With current C# possibilities"?号

但是,如果您安装 FodyPropertyChanged.Fody NuGet 程序包并将包含以下内容的名为 "FodyWeavers.xml" 的文件添加到您的项目中:

<Weavers>
    <PropertyChanged />
</Weavers>

...Fody 将在您构建时将引发 PropertyChanged 事件的代码注入所有 类 的所有 类 设置器中,这些设置器实现 INotifyPropertyChanged项目。

更多信息请参考GitHub