【问题标题】:How to fire a command on double-click listbox item using MVVM?如何使用 MVVM 在双击列表框项上触发命令?
【发布时间】:2012-06-23 19:41:57
【问题描述】:

当用户双击列表框项目时,我正在尝试启动 ICommand。另外,我正在尝试使用 MVVM 模式来做到这一点。

在此 XAML 中,按键“p”可以正常工作。当我双击列表框时,该命令永远不会启动。我设置了一个断点来确认“PlayVideoCommand”不是通过双击调用的。我错过了什么还是我必须使用 Setter(我不熟悉)?

<ListBox Name="SmallVideoPreviews" Grid.Column="1" MaxHeight="965"
    ItemsSource="{Binding BrowseVideos}" 
    ItemTemplate="{StaticResource BrowseTemplate}">
    <ListBox.InputBindings>
        <KeyBinding Key="p" 
            Command="{Binding PlayVideoCommand}"
            CommandParameter="{Binding ElementName=SmallVideoPreviews, Path=SelectedItem}"/>
        <MouseBinding Gesture="LeftDoubleClick"
            Command="{Binding PlayVideoCommand}"
            CommandParameter="{Binding ElementName=SmallVideoPreviews, Path=SelectedItem}"/>
    </ListBox.InputBindings>
</ListBox>

双击和“p”应该执行相同的命令。使用鼠标时,我可以看到 listboxitem 被选中。我有预感 MouseBinding Command 属性不是依赖属性,但我不知道如何确认。

【问题讨论】:

    标签: c# wpf mvvm dependency-properties


    【解决方案1】:

    您的示例中发生的情况是列表框本身对双击做出反应,但仅在列表框项目未覆盖的部分区域中。

    您需要将事件处理程序绑定到列表框项。

    这里有一些方法: Double Click a ListBox item to open a browser

    还有一些关于为什么 MVVM 中的小代码隐藏不一定是一件可怕的事情的讨论: Firing a double click event from a WPF ListView item using MVVM

    更多讨论: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/9fb566a2-0bd6-48a7-8db3-312cd3e93340/

    【讨论】:

    • 我看到了您发布的第二个链接,但希望自从几年前发布后情况有所改变。我想我将在文件后面的代码中发布几行。我很难在这个上坚持使用 MVVM。感谢您提供详细信息。
    【解决方案2】:

    ListBox 似乎无法处理对 ListBoxItem 的双击。这是一个很好的答案: Can't bind Command to ListBox

    【讨论】:

      【解决方案3】:

      人们可能会争论天气或不代码隐藏是可怕的,但它可以使用命令。像这样将 LeftDoubleClick 手势添加到 ItemTemplate:

      <UserControl.Resources>
          <DataTemplate x:Key="BrowseTemplate" >
              <StackPanel >
                  <StackPanel.InputBindings>
                      <MouseBinding Gesture="LeftDoubleClick"
                                    Command="{Binding DataContext.PlayVideoCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Mode=OneWay}" 
                                    CommandParameter="{Binding }" />
                  </StackPanel.InputBindings>
                  <TextBlock Text="{Binding }" Width="50" />
              </StackPanel>
          </DataTemplate>
      </UserControl.Resources>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        • 2011-07-06
        • 2010-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多