Как переопределить метаданные DataContextProperty в нестатическом конструкторе - PullRequest
0 голосов
/ 17 января 2019

Мне нужно переопределить метаданные DataContextProperty в моем ContentControl, чтобы связать PropertyChangedCallback.

Как я знаю, это разрешено только в статическом конструкторе, но PropertyChangedCallback не может быть статической функцией. Есть ли лучший способ добиться этого?

Статический конструктор:

static ListAndDetailsControl() {    
DataContextProperty.OverrideMetadata(typeof(ListAndDetailsControl), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnDataContextChanged)));
}

функция, которая должна вызываться при изменении свойства:

private void OnDataContextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {}

1 Ответ

0 голосов
/ 17 января 2019

OverrideMetadata не должно быть обязательным в статическом конструкторе (но он должен быть там).Вы можете поместить это, например, в Button.Click обработчик событий.

PropertyChangedCallback не может быть статической функцией

Это неправильно.PropertyChangedCallback может быть статической функцией.

Проблема в том, что, если кто-то уже зарегистрировал / переопределил метаданные для свойства, вы получите исключение.

См. На MSDN:

Кроме того, метаданные могут быть переопределены только один раз для каждого типа.Последующие попытки переопределить метаданные для того же типа вызовут исключение.

Для отслеживания изменений в DataContext просто используйте соответствующее событие ContentControl.DataContextChanged.

<ContentControl DataContextChanged="OnDataContextChanged">

Чтобы избежать кода позадииспользуйте обработку поведения DataContextChanged.

...