我有一个 WPF 应用程序,在一个窗口中有许多基于列表的控件,它们都绑定到不同的 CollectionView。
在窗口级别有没有办法为当前基于焦点列表的控件获取当前选定的项目?我知道我可以通过寻找焦点元素来使用一些相当简单的代码来做到这一点,但是 WPF 是否支持将其作为一个开箱即用的概念?
像 Window.CurrentSelectedDataItem 这样的东西会很棒。我正在研究将其用作集中命令管理的一种方式,以根据当前选定的数据项启用禁用命令。
我有一个 WPF 应用程序,在一个窗口中有许多基于列表的控件,它们都绑定到不同的 CollectionView。
在窗口级别有没有办法为当前基于焦点列表的控件获取当前选定的项目?我知道我可以通过寻找焦点元素来使用一些相当简单的代码来做到这一点,但是 WPF 是否支持将其作为一个开箱即用的概念?
像 Window.CurrentSelectedDataItem 这样的东西会很棒。我正在研究将其用作集中命令管理的一种方式,以根据当前选定的数据项启用禁用命令。
我认为没有像您指定的属性,但作为替代方案,您可以在 Window 类中为 ListBox.SelectionChanged 事件注册 ClassHandler:
EventManager.RegisterClassHandler(typeof(ListBox), ListBox.SelectionChanged,
new SelectionChangedEventHandler(this.OnListBoxSelectionChanged));
每当您的应用程序中任何 ListBox 中的选择发生更改时,都会调用此方法。您可以使用 sender 参数来确定是哪个 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
返回第二个参数,如果第一个为真,否则为空。coalesce
返回第一个非空元素。