Как CanExecute commandBinding срабатывает после удаления элемента из визуального дерева? - PullRequest
4 голосов
/ 11 января 2010

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

Ответы [ 2 ]

2 голосов
/ 13 июля 2010

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

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

Решение:

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

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

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

1 голос
/ 15 января 2010

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

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

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

...