WPF MVVM。在 ListViewItem 上左键双击

WPF MVVM. Left DoubleClick on ListViewItem

我想要的:如果我在 ListViewItem 上左键双击,我想调用一个方法。

我有:

Xaml:

 <ListView ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
                      Name="StructListView"
                      Margin="15" 
                      Grid.Row="2" 
                      BorderThickness="0" 
                      SelectedItem="{Binding SelectedStructObject}" 
                      ItemsSource="{Binding StructObjects, Mode=TwoWay}"
                      HorizontalAlignment="Left"
                      HorizontalContentAlignment="Left">

                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="MouseDoubleClick">
                        <i:InvokeCommandAction 
                    Command="{Binding Command}"
                    CommandParameter="{Binding ElementName=StructListView, Path=SelectedItem}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
                ...

主视图模型:

public class MainViewModel : BaseViewModel
{
    private StructElement _selectedStructObject;

    public StructElement SelectedStructObject
    {
        get { return _selectedStructObject; }
        set
        {
            if (_selectedStructObject != value)
            {
                _selectedStructObject = value;
                OnPropertyChanged();
            }
        }
    }

    public RelayCommand Command { get; set; }

    public ObservableCollection<StructElement> StructObjects { get; set; }

    private StructElement _structElement;

    public StructElement StructObject
    {
        get { return _structElement; }
        set
        {
            if (_structElement != value)
            {
                _structElement = value;
                OnPropertyChanged();
            }
        }
    }


    public MainViewModel()
    {

        Command = new RelayCommand(o => { //Method; });
      
        StructObjects = new ObservableCollection<StructElement>();         

    }
}

中继命令:

public class RelayCommand : ICommand
{
    private readonly Action<object> execute;
    private readonly Predicate<object> canExecute;

    public RelayCommand(Action<object> execute)
        : this(execute, null)
    {
    }

    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
        {
            throw new ArgumentNullException("execute");
        }

        this.execute = execute;
        this.canExecute = canExecute;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public bool CanExecute(object parameter)
    {
        if (canExecute == null)
        {
            return true;
        }

        return canExecute(parameter);
    }

    public void Execute(object parameter)
    {
        execute(parameter);
    }

}

我知道如果我处理事件,我可以使用类似的东西:

void OnMouseDoubleClick(Object sender, MouseButtonEventArgs e)
{
    if (e.ChangedButton == MouseButton.Left)
    {
    // Method
    }
}

但是因为我正在使用 RelayCommand,所以我没有像 MouseButtonEventArgs 这样的事件? 我考虑过使用 RelayCommand“触发”OnMouseDoubleClick 吗?

我对编程和 WPF 非常了解,所以如果您有更多关于我应该阅读以了解解决方案的信息,我将不胜感激。

谢谢。

我遇到了与 Link 不同的解决方案。

在我的 XAML 中,我使用 MVVMLight 中的“EventToCommand”:

                    <i:Interaction.Triggers>
                    <i:EventTrigger EventName="MouseDoubleClick">
                        <cmd:EventToCommand Command="{Binding LightCommand}"
                                            PassEventArgsToCommand="True"/>                            
                    </i:EventTrigger>
                    </i:Interaction.Triggers>

我将我的 RelayCommand 设为通用的,这样我就可以传递一个事件(我希望我的描述是正确的):

 public class RelayCommand : ICommand
{
    private readonly Action<object> execute;
    private readonly Predicate<object> canExecute;

    public RelayCommand(Action<object> execute)
        : this(execute, null)
    {
    }

    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
        {
            throw new ArgumentNullException("execute");
        }

        this.execute = execute;
        this.canExecute = canExecute;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public bool CanExecute(object parameter)
    {
        if (canExecute == null)
        {
            return true;
        }

        return canExecute(parameter);
    }

    public void Execute(object parameter)
    {
        execute(parameter);
    }

}

在我的 MainViewModel 中,我声明了一个带有 MouseButtonEventArgs 的 RelayCommand 并传递了一个方法来检查 MouseButton 是否为左键单击并执行某些操作:

public RelayCommand<MouseButtonEventArgs> LightCommand { get; set; }

public void dosomething(MouseButtonEventArgs e)
    {
        if (e.ChangedButton == MouseButton.Left) 
        {
            MessageBox.Show(e.OriginalSource.GetType().ToString());
        }           
    }


public MainViewModel()
    {       
        LightCommand = new RelayCommand<MouseButtonEventArgs>(dosomething);
    }