Я подозреваю, что поведение, которое вы видите, является результатом анимации, которую вы используете, когда IsEnabled становится ложным. DependencyProperties на самом деле имеет приоритет, связанный с ними, в котором анимации находятся высоко в списке; эта иерархия из MSDN :
- Принуждение системы собственности
- Активные анимации или анимации с поведением Hold.
- Местное значение
- Свойства шаблона TemplatedParent
- Неявный стиль
- Стиль триггеров
- Шаблон триггеров
- Установщики стиля
- Стиль по умолчанию (тема)
- Наследуется от родителя
- Значение по умолчанию из метаданных свойства зависимостей
По умолчанию анимации имеют FillBehavior HoldEnd, что означает, что они остаются на значении, при котором анимация закончилась. Когда IsEnabled становится True благодаря вашей привязке, это обновление происходит на уровне «Локальное значение» в приоритете, и поскольку раскадровка DisableActivating поддерживает внешний вид с более высоким уровнем приоритета («анимации с поведением удержания»), вы никогда не увидите кнопка меняется, как только она изменилась в первый раз.
Для этого есть три решения:
- Обновите вашу анимацию, чтобы иметь FillBehavior of Stop, что означает, что анимация не будет утверждать визуальный элемент «IsEnabled = False» после остановки анимации. Вам понадобится стандартный неанимированный триггер с тем же состоянием, что и в конце анимации, чтобы продолжать утверждать это после завершения анимации, иначе вы просто увидите, что он возвращается к состоянию, в котором он был, когда началась анимация. , Поскольку это просто набор триггеров, при обновлении локального значения оно вернется к исходному значению, как вы ожидаете. Кроме того, поскольку анимация имеет более высокий приоритет, вы можете установить стиль и запустить анимацию одновременно и только «увидеть» влияние стиля после завершения анимации (поэтому ваше затухание будет работать так, как ожидается).
- Вместо изменения FillBehavior, вы можете создать новый триггер, который применяется, когда IsEnabled равен True, который оживляет (возможно, мгновенно) обратно в исходное состояние. Это также можно сделать, применив анимацию в ExitAction триггера. Так как это также анимация, но она была применена позже, она переопределит состояние HoldEnd другой анимации. В некотором смысле, это проще, чем вариант 1, но это может стать проблемой для поддержания прямой и обратной анимации, особенно если вам не нужна обратная анимация для определенного визуального эффекта; однако вы можете захотеть, чтобы он постепенно исчезал в и из отключенного состояния.
- Добавьте ExitAction к своему триггеру IsEnabled, чтобы остановить раскадровку, не позволяя анимации продолжать утверждать значение, которое она имела в конце анимации, чтобы можно было применить стиль локальных значений. Эта опция имеет то преимущество, что не нужно повторять стиль (как в # 1), а также нет необходимости изменять анимацию (как в # 2).
Из трех решений последнее, вероятно, является наиболее чистым с архитектурной точки зрения (если только у вас нет конкретной причины, например, необходимость постепенного исчезновения как изнутри, так и снаружи, чтобы выбрать один из других вариантов - или комбинацию из перечисленных выше вариантов).