WPF:长期坚持ListViewItem

问题描述 投票:0回答:1

我希望在用户按住之后长时间抓住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总是-1selectedItem总是null

wpf command listviewitem
1个回答
0
投票

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

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

像这样:

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");
        }
    }

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

© www.soinside.com 2019 - 2024. All rights reserved.