【问题标题】:Double left click on listview WPF双击listview WPF
【发布时间】:2020-10-23 07:11:15
【问题描述】:

我会在 ListView 中的项目上的左键双击事件上绑定一个 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>

【问题讨论】:

  • 那是因为你在 ListView 上有输入绑定,你应该为 listViewItem 创建一个。 SO question
  • ItemContainerStyle 中为MouseDoubleClick 事件添加一个EventSetter 并从命令处理程序调用命令,或者使用附加的行为来执行命令。
  • @XAMlMAX 我尝试了两种灵魂,但仍然无法正常工作
  • @mm8 可以发个代码吗?

标签: c# wpf listview mvvm binding


【解决方案1】:

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

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>

【讨论】:

  • 我会试试这个解决方案,但是这样我怎么发送参数?
  • @Francesco:您需要为命令参数添加另一个附加属性并以完全相同的方式进行设置。
【解决方案2】:

另一个简单的解决方案是覆盖ListBoxItemControlTemplate,在上面设置InputBindings

<ListView>
  <ListView.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="ListBoxItem">
            <Border Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
              <Border.InputBindings>
                <MouseBinding MouseAction="{x:Static MouseAction.LeftDoubleClick}"
                              Command="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=DataContext.SelectPageCommand}"
                              CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=SelectedItem}" />
              </Border.InputBindings>

              <ContentPresenter />
            </Border>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </ListView.ItemContainerStyle>
</ListView>

或者将整个项目变成Button

<ListView>
  <ListView.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="ListBoxItem">
            <Button Content="{TemplateBinding Content}" 
                    Command="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=DataContext.SelectedItemCommand}" 
                    CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=SelectedItem}" />
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </ListView.ItemContainerStyle>
</ListView>

您肯定想要设置项目样式以移除按钮外观。

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2010-11-05
    • 2011-02-10
    相关资源
    最近更新 更多