双击 WPF 中列表视图项的事件

本文关键字:事件 视图 列表 WPF 双击 | 更新日期: 2023-09-27 18:35:38

我知道这已经被问了很多,但我没有找到任何解决方案。

我的ListView看起来像这样

<ListView Margin="0,0,0,0" x:Name="ContactListView" BorderBrush="Black" ItemsSource="{Binding RosterItemX}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Height="25">
                <Image Tag="{Binding Availability}" Margin="0,0,5,0" Width="16" Height="16" VerticalAlignment="Center">
                </Image>
                <TextBlock Text="{Binding Name}" VerticalAlignment="Center"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDoubleClick">
            <Custom:EventToCommand Command="{Binding ContactDblClicked, Mode=OneWay}" PassEventArgsToCommand="True" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ListView>

我的视图模型中有我的ICommand

public ICommand ContactDblClicked { get { return new RelayCommand<MouseButtonEventArgs>(contactDblClicked); } }

每次有人双击ListView时都会触发此事件。不必在ListViewItem.

我可以处理没有选择ListViewItem的情况。我投(ListView)e.Source,并检查是否选择了项目。

我需要一种方法来检查双击的内容是否实际上是ListViewItem而不是空白空间。

双击 WPF 中列表视图项的事件

不完全确定最后一行是什么意思,我需要一种方法来检查双击的内容是否实际上是ListViewItem而不是空白区域,但这里有两个建议:

首先,如果要检查ListView中是否选择了某个项目

private void contactDblClicked(MouseButtonEventArgs obj)
{
  var listView = obj.Source as ListView;
  if (listView != null)
  {
    if (listView.SelectedItem != null)
    {
      Debug.WriteLine("item selected");
    }
    else
    {
      Debug.WriteLine("item not selected");
    }
  }
}

但是,我认为您已经得到了该解决方案,如果我正确理解了您的问题,即使选择了某个项目,您也想检查用户是否实际单击了某个项目(而不是空格)。

因此,这是检查项目是否真的被点击的第二种方法:

private void contactDblClicked(MouseButtonEventArgs obj)
{
  if (((FrameworkElement) obj.OriginalSource).DataContext is YourRosterItemXType)
  {
    Debug.WriteLine("item was *really* clicked");
  }
}

其中YourRosterItemXType是绑定RosterItemX属性的类型。使用上面的代码,您可以检查鼠标事件的原始源的DataContext是否设置为 YourRosterItemXTypeListView中的项设置了该DataContext,因此请检查该鼠标事件是否确实来自这些列表项之一。