无法使用 DataTemplate WPF 将 InputBinding 应用于整个 ListBoxItem
Posted
技术标签:
【中文标题】无法使用 DataTemplate WPF 将 InputBinding 应用于整个 ListBoxItem【英文标题】:Cant get InputBinding to apply to entire ListBoxItem using DataTemplate WPF 【发布时间】:2016-10-17 10:05:55 【问题描述】:试图在 WPF 的 ListBox 中对我的 ListBoxItems 进行一些键绑定。我正在使用 MVVM,并将 ListBox 的 ItemSource 绑定到 ViewModel 列表。此 ViewModel 有一个字符串和一个布尔值,用于表示“已选择”。我希望将 Selected 显示为 CheckBox 的属性。
我正在尝试这样做,以便如果我使用键盘上的向上和向下箭头导航列表项,然后按 enter/space/whatever,我可以切换复选框。但是,我必须先按 Tab,才能将焦点放在包含复选框的 StackPanel 上。
<DataTemplate x:Key="MyTemplate" DataType="x:Type ViewModel">
<Border Width="2" BorderBrush="Blue">
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyUp">
<i:InvokeCommandAction Command="Binding EnterCommand" />
</i:EventTrigger>
</i:Interaction.Triggers>
<CheckBox VerticalAlignment="Center"
Content="Binding Name"
IsChecked="Binding Selected"
Margin="3" />
</Border>
</DataTemplate>
=========================
<Popup x:Name="FilterPopup" Grid.Column="1"
IsOpen="Binding IsChecked, ElementName=FilterButton"
StaysOpen="False"
PlacementTarget="Binding ElementName=FilterButton"
Placement="Top">
<ListBox ItemsSource="Binding ViewModels"
ItemTemplate="StaticResource MyTemplate" />
</Popup>
我错过了什么明显的东西???
【问题讨论】:
【参考方案1】:上面的触发器是在数据模板内触发的,而不是在项目容器内。因此,如果最后一个被聚焦,则没有效果。
为避免这种情况,应在项目容器级别指定触发器:
<ListBox.ItemContainerStyle>
<Style>
<Setter Property="l:Attach.InputBindings">
<Setter.Value>
<InputBindingCollection>
<KeyBinding Command="Binding EnterCommand" Key="Enter" />
<KeyBinding Command="Binding EnterCommand" Key="Space" />
</InputBindingCollection>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
我采用了一种方法来设置来自this question 的样式的输入绑定。
【讨论】:
以上是关于无法使用 DataTemplate WPF 将 InputBinding 应用于整个 ListBoxItem的主要内容,如果未能解决你的问题,请参考以下文章
WPF为没有DataTemplate属性的控件创建DataTemplate
将 WPF 按钮 CommandParameter 绑定到 DataTemplate 中的按钮本身
WPF -- DataTemplate与ControlTemplate结合使用
WPF - DataGridTemplate与DataTemplate.Triggers
WPF 菜单事件绑定 DataTemplate下button Command事件绑定 DataTemplate遍历实体数据