Как CanExecute commandBinding может срабатывать после удаления элемента из визуального дерева?

У меня есть связанный вопрос здесь, где у меня есть пользовательский элемент управления с привязкой команды. Пользовательский элемент управления был удален из визуального дерева, но canExecute все еще работает. Мое понимание модели Командования было то, что она пузырится и туннелирует как перенаправленные события. Итак, как CanExecute может запускаться, когда элемент с прикрепленной привязкой команды больше не находится в визуальном дереве?

2 ответа

IMO, CommandBindings действительно плохо реализованы в WPF. Вы должны обойти тот факт, что система сохраняет WeakReference для вашего элемента управления, если она имеет CommandBinding, даже когда элемент управления закрыт.

В Интернете вы увидите множество примеров того, как настроить привязку CommandBinding в коде XAML. Проблема в том, что все эти примеры будут представлять проблемы с производительностью в любом приложении, куда они вставлены. Привязки команд никогда не исчезнут сами по себе. По крайней мере, не надолго.

Решение состоит в том, чтобы:

A) Не устанавливайте CommandBindings в XAML. Вы должны использовать код позади. Предложите использовать конструктор после вызова InitializeComponent(). Используйте this.CommandBindings.Add(), чтобы добавить CommandBindings с кодом.

B) обработать событие Closed() вашего Window или Control и вызвать this.CommandBindings.Clear().

Это единственный способ, которым я смог надежно заставить CommandBindings прекратить стрельбу. Я думаю, что это нелепый способ реализации этой функции Microsoft. Тот факт, что так много онлайн-примеров учат вас объявлять CommandBindings в XAML, только усугубляет проблему.

Я предполагаю, что есть экземпляр команды, зарегистрированный с помощью менеджера команд. Команды могут выполняться из разных источников, а не только из пользовательского интерфейса, например, сочетания клавиш.

Попробуйте вызвать CommandManager.InvalidateRequerySuggested(); и добавьте точку останова в свой метод canexecute, чтобы подтвердить, что это так.

Надеюсь это поможет.

Другие вопросы по тегам