无法使用 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遍历实体数据

WPF中Control Template和DataTemplate的区别