Можно ли объявить свойство, вызывающее событие PropertyChanged, используя синтаксис, подобный авто-свойству ({get; set;})? - PullRequest
0 голосов
/ 01 октября 2019

Мне интересно, как упростить использование свойств, когда они должны вызывать событие PropertyChanged. Я имею в виду, что как только вам нужно вызвать событие, сеттер должен это сделать, поэтому свойство не может быть авто-свойством. Это приводит к некоторому усложнению кода, особенно когда речь идет о нескольких свойствах, ни с какой другой целью, кроме как просто вызвать событие:

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 # есть ли способ упростить исходный код? (Я расширяю возможности до любой возможности).

1 Ответ

1 голос
/ 01 октября 2019

"С текущими возможностями C #"? Нет.

Но если вы установите пакеты Fody и PropertyChanged.Fody NuGet и добавите файл с именем "FodyWeavers.xml" со следующим содержимым в ваш проект:

<Weavers>
    <PropertyChanged />
</Weavers>

... Fody внедрит код, который вызывает событие PropertyChanged, во все установщики свойств всех классов, которые реализуют INotifyPropertyChanged при создании проекта.

Пожалуйста, обратитесь к GitHub для получения дополнительной информации.

...