双击 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
而不是空白空间。
不完全确定最后一行是什么意思,我需要一种方法来检查双击的内容是否实际上是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
是否设置为 YourRosterItemXType
。ListView
中的项设置了该DataContext
,因此请检查该鼠标事件是否确实来自这些列表项之一。