首页 > 解决方案 > WPF:长期持有 ListViewItem

问题描述

我想ListViewItem在用户按住并按下左键button然后在半秒后释放后长时间保持。

这是我到目前为止所尝试的,我设法抓住了第一个click

<ListView>
    <i:EventTrigger EventName="PreviewMouseLeftButtonDown">
        <i:InvokeCommandAction 
                Command="{Binding ListViewItemHoldCommand}"
                 CommandParameter="{Binding ElementName=ListViewFiles, Path=SelectedItem}"/>
    </i:EventTrigger>
        </i:Interaction.Triggers>
</ListView>

在我的ListViewItemHoldCommand课堂上,我抓住了这个点击function

public void Execute(object parameter)
{

}

接下来我需要做什么?

编辑

我也试试这个:

<Window
x:Name="mainView"
</Window

<i:EventTrigger EventName="PreviewMouseLeftButtonDown">
      <i:InvokeCommandAction 
            Command="{Binding DataContext.ListViewItemHoldCommand, ElementName=mainView}"
            CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}}"/>
</i:EventTrigger>

public void Execute(object parameter)
{
    ListView listView = parameter as ListView;
    if (listView != null)
    {
        var selectedIndex = listView.SelectedIndex;
        var selectedItem = listView.SelectedItem;
    }
}

但是selectedIndex总是-1并且selectedItem总是为空

标签: wpfcommandlistviewitem

解决方案


它们为空,因为预览是在任何事情发生之前。这意味着您的代码在选择 listviewItem 之前正在运行。

为了确保选择了某些东西,通常的 mvvm 方法是绑定 selecteditem 并在绑定属性的设置器中操作。

像这样:

https://social.technet.microsoft.com/wiki/contents/articles/30564.wpf-uneventful-mvvm.aspx#Select_From_List_IndexChanged

长按鼠标没有事件。您必须处理 mousedown,引入延迟,然后检查鼠标按钮是否仍然按下。

例如

    private async void ListViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        ListViewItem lvi = sender as ListViewItem;
        await Task.Delay(500);
        if (Mouse.LeftButton == MouseButtonState.Pressed)
        {
            Console.WriteLine("Do something here");
        }
    }

如果您要通过项目重用代码,请重构为行为。


推荐阅读