Обратный вызов, когда свойство зависимостей получает изменение xaml

Когда я устанавливаю значение IsClosed во время выполнения, OnIsClosedChanged() называется штрафом. Однако конструктор устанавливает значение свойства, но не вызывает OnIsClosedChanged() .

 public static DependencyProperty IsClosedProperty = DependencyProperty.Register("IsClosed", typeof(bool), typeof(GroupBox), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); public bool IsClosed { get { return (bool)this.GetValue(IsClosedProperty); } set { if ((bool)this.GetValue(IsClosedProperty) == value) return; this.SetValue(IsClosedProperty, value); OnIsClosedChanged(); } } private void OnIsClosedChanged() { _rowDefContent.Height = new GridLength((IsClosed ? 0 : 1), GridUnitType.Star); } 

Очевидно, что IsClosed не изменяется конструктором, и только IsClosedProperty получает изменение xaml.
Мой вопрос: как я могу запустить IsClosed после того, как значение было изменено в Designer. Или, по крайней мере, добавить некоторую логику к изменениям, не связанным с исполнением.

Вам нужно будет зарегистрировать PropertyChangedCallback с метаданными свойств.

Причина в том, что свойства зависимостей, установленные в XAML или привязками или каким-либо другим источником, не вызывают оболочку CLR (метод setter). Причина объясняется в статье свойств XAML по загрузке и зависимостям в MSDN:

По соображениям реализации вычислительно дешевле идентифицировать свойство как свойство зависимостей и обращаться к методу SetValue системы свойств, чтобы установить его, а не использовать оболочку свойств и ее сеттер.

Поскольку текущая реализация WPF поведения процессора XAML для параметра свойства полностью обходит обертки, вы не должны вводить какую-либо дополнительную логику в определения набора обертки для вашего пользовательского свойства зависимостей. Если вы поместите такую ​​логику в определение набора, тогда логика не будет выполняться, если свойство задано в XAML, а не в коде.

Ваш код должен выглядеть так:

 public static readonly DependencyProperty IsClosedProperty = DependencyProperty.Register( "IsClosed", typeof(bool), typeof(GroupBox), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender, (o, e) => ((GroupBox)o).OnIsClosedChanged())); public bool IsClosed { get { return (bool)GetValue(IsClosedProperty); } set { SetValue(IsClosedProperty, value); } } private void OnIsClosedChanged() { _rowDefContent.Height = new GridLength((IsClosed ? 0 : 1), GridUnitType.Star); } 

Теперь я нашел ответ. ValidateValueCallback действительно близок! (как указал Алекс К). Но это статический метод, и я не получаю никакой ссылки на экземпляр, который был изменен. Ключом является использование PropertyChangedCallback в FrameworkPropertyMetadata, который также является аргументом, переданным методу Property.Register.
Видеть:

 public static DependencyProperty IsClosedProperty = DependencyProperty.Register("IsClosed", typeof(bool), typeof(GroupBox), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnIsClosedChangedPCC))); public bool IsClosed { get { return (bool)this.GetValue(IsClosedProperty); } set { this.SetValue(IsClosedProperty, value); OnIsClosedChanged(); } } private static void OnIsClosedChangedPCC(DependencyObject d, DependencyPropertyChangedEventArgs e) { GroupBox current = (GroupBox)d; current.IsClosed = current.IsClosed; } private void OnIsClosedChanged() { _rowDefContent.Height = new GridLength((IsClosed ? 0 : 1), GridUnitType.Star); } 

Теперь он снова устанавливает IsClosedValue который запускает OnIsClosedChanged .
Спасибо за помощь ребята!

  • Как читать файл свойств в веб-приложении?
  • В чем разница между инкапсулированием частного члена как свойства и определением свойства без частного члена?
  • Загрузить файл свойств в JAR?
  • Как я могу оценивать код C # динамически?
  • Почему нам нужны свойства в C #
  • Свойство C # и параметр ref, почему нет сахара?
  • Являются ли функции get и set популярными у программистов на C ++?
  • appSettings vs applicationSettings. appSettings устарел?
  • Как настроить log4j с файлом свойств
  • Миксины против черт
  • Как скрыть унаследованное свойство в classе без изменения унаследованного classа (базового classа)?
  • Interesting Posts

    Как удалить символ по заданному индексу из строки в C?

    Разница между Visual Basic 6.0 и VBA

    Неподдерживаемый запрос на получение в API графиков Google

    Как отправить строку из одного экземпляра моей программы Delphi в другую?

    Как безопасно хранить учетные данные (пароль) в приложении Android?

    использование внешних JS-библиотек в моем проекте с угловым 2

    неопределенность в разработке модели базы данных

    Использование cudamalloc (). Почему двойной указатель?

    Каким должен быть цвет Ripple, colorPrimary или colorAccent? (Дизайн материалов)

    Почему% eax обнуляется перед вызовом printf?

    Улучшение производительности объемной вставки в инфраструктуре Entity

    Зачем использовать class C # System.Random вообще, а не System.Security.Cryptography.RandomNumberGenerator?

    Класс JavaLaunchHelper реализован в обоих. Один из двух будет использован. Какой из них не определен

    Рекурсивно Получить свойства и дочерние свойства classа

    Ls -la symbolics … что означает этот последний символ?

    Давайте будем гением компьютера.