Как 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, чтобы подтвердить, что это так.
Надеюсь это поможет.