c# - 双击listview WPF

标签 c# wpf listview mvvm binding

我会在 ListView 中的项目上的左双击事件上绑定(bind)一个 ICommand。
我尝试了下面的解决方案但无法正常工作,当我单击 ListView 而不是列表中的项目时会调用 Execute 函数。有人有什么建议吗?

       <ListView x:Name="history_list_view" HorizontalAlignment="Left" Height="210" Margin="25,194,0,0" 
                  VerticalAlignment="Top" Width="656" Background="#FF2F2B2B" Foreground="White"
                  ItemsSource="{Binding Items}"
                  SelectedItem="{Binding SelectedItem}">
            <ListView.InputBindings >
                <MouseBinding Gesture="LeftDoubleClick" Command="{Binding SelectedItemCommand}" CommandParameter="{Binding SelectedItem}"/>
            </ListView.InputBindings>
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" Value="#7f8c8d"/>
                            <Setter Property="BorderThickness" Value="0" />
                        </Trigger>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="#7f8c8d"/>
                            <Setter Property="BorderThickness" Value="0" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.View>
                <GridView >
                    <GridView.ColumnHeaderContainerStyle>
                        <Style TargetType="{x:Type GridViewColumnHeader}">
                            <Setter Property="HorizontalContentAlignment" Value="Left" />
                        </Style>
                    </GridView.ColumnHeaderContainerStyle>
                    <GridViewColumn Header="Lot" Width="170" DisplayMemberBinding="{Binding Lot}"/>
                    <GridViewColumn Header="Code" Width="160" DisplayMemberBinding="{Binding Code}"/>
                    <GridViewColumn Header="Rev" Width="80" DisplayMemberBinding="{Binding Rev}"/>
                    <GridViewColumn Header="User" Width="140" DisplayMemberBinding="{Binding User}"/>
                    <GridViewColumn Header="Date" Width="100" DisplayMemberBinding="{Binding Date}"/>
                </GridView>
            </ListView.View>
        </ListView>

最佳答案

添加 EventSetter对于MouseDoubleClick ItemContainerStyle 中的事件并从代码隐藏中的事件处理程序调用命令,或使用附加行为来执行命令:

public static class DoubleClickBehavior
{
    public static ICommand GetCommand(ListViewItem obj) => (ICommand)obj.GetValue(CommandProperty);

    public static void SetCommand(ListViewItem obj, ICommand value) => obj.SetValue(CommandProperty, value);

    public static readonly DependencyProperty CommandProperty =
        DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(DoubleClickBehavior), new PropertyMetadata(null, OnCommandChanged));

    private static void OnCommandChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        ListViewItem lvi = (ListViewItem)sender;
        lvi.MouseDoubleClick += Lvi_MouseDoubleClick;
    }

    private static void Lvi_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        ListViewItem lvi = (ListViewItem)sender;
        ICommand command = GetCommand(lvi);
        if (command != null)
            command.Execute(null);
    }
}
XAML:
<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="local:DoubleClickBehavior.Command"
                Value="{Binding DataContext.SelectedItemCommand, RelativeSource={RelativeSource AncestorType=ListView}}" />
    </Style>
</ListView.ItemContainerStyle>

关于c# - 双击listview WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62700523/

相关文章:

WPF 为接口(interface)指定 HierarchicalDataTemplate

android - 如何在我的 ListView 上设置自定义字体?

c# - 如何在 ListBox 中显示我所有的 sql 表

c# - 在文件夹 View 中,visual studio 2017 中的项目属性在哪里?

没有Visual Studio的WPF?

c# - 如何为 WPF 命令绑定(bind)编写测试?

java - 安卓-ListView : Checkboxes not staying checked

android - 迁移 androidx 和 android sdk 29 后发生崩溃吗?

c# - 通知不振动或显示灯光

c# - 如果您只是在之后立即调用 End,为什么还要调用 WaitOne? End 不阻塞吗?