Как определить WPF SelectedItem для окна
У меня есть приложение WPF с множеством элементов управления на основе списка в окне, которые связаны с различными коллекциями.
На уровне окна есть способ получить текущий выбранный элемент для текущего элемента управления на основе списка фокусировки? Я знаю, что могу сделать это с помощью довольно тривиального кода, ища элемент in focus, но поддерживает ли WPF это как концепцию из коробки?
Что-то вроде Window.CurrentSelectedDataItem было бы здорово. Я пытаюсь использовать это как способ централизованного управления командами для включения отключения команд на основе текущего выбранного элемента данных.
2 ответа
Я не думаю, что есть свойство, как вы указываете, но в качестве альтернативы вы можете зарегистрировать ClassHandler для события ListBox.SelectionChanged в вашем классе Window:
EventManager.RegisterClassHandler(typeof(ListBox), ListBox.SelectionChanged,
new SelectionChangedEventHandler(this.OnListBoxSelectionChanged));
Он будет вызываться всякий раз, когда выбор изменяется в любом ListBox в вашем приложении. Вы можете использовать аргумент отправителя, чтобы определить, какой именно ListBox изменил свой выбор, и кэшировать это значение, когда вам это нужно.
Я не пробовал это, но вы можете попробовать использовать MultiBinding с конвертером, чтобы получить нужный элемент:
<MultiBinding Converter="{StaticResource coalesce}">
<MultiBinding.Bindings>
<MultiBinding Converter="{StaticResource nullIfFalse}">
<MultiBinding.Bindings>
<Binding ElementName="List1" Path="HasFocus" />
<Binding ElementName="List1" Path="SelectedItem" />
nullIfFalse
возвращает второй параметр, если первый равен true, в противном случае -null. coalesce
возвращает первый ненулевой элемент.