2016-10-06 3 views
1

Der Versuch, Drag & Drop von Textdateien von einem WPF DataGrid nach Notepad/Excel zu programmieren. Ich versuche, diesen Code in MainViewModel zu verwenden:DataGrid & Mouse Event als Parameter

private void FileDragDrop(object sender, MouseEventArgs e) 
    { 
     try 
     { 
      Process.Start(Path.Combine(ResultSnapshotFolder, cell)); 
      if (e.MiddleButton != MouseButtonState.Pressed) return; 
      var d = new DataObject(); 
      d.SetData(DataFormats.Serializable, SelectedRow); 
      d.SetData(DataFormats.Text, SelectedRow.ToString()); 
      DragDrop.DoDragDrop(grid, d, DragDropEffects.Copy); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

XAML Mousebinding:

 <MouseBinding 
       MouseAction="MiddleClick" 
       Command="{Binding FileDragDrop}" 
       CommandParameter="{Binding ElementName=FileGrid }" /> 

Im Folgenden finden Sie die überladene DelegateCommand, für verschiedene Mausaktionen:

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

    public void Execute(object parameter, MouseEventArgs argsMouse) 
    { 
     _dataGridDragDrop(parameter, argsMouse); 
    } 

Mein Problem ist, dass "Execute (Objektparameter)" wird immer zur Laufzeit ausgeführt, als ob die "MouseEventArgs argsMouse" niemals von der XAML-Ansicht an das MainViewModel mit dem Da übergeben wird taGrid-Objekt.

Grundsätzlich kann ich nur Methoden mit 1 Parameter ausführen, wenn ich eine Methode mit 2 Parametern ausführen möchte.

Kennt jemand einen Weg um diesen oder einen anderen Ansatz, der das Problem lösen könnte?

+1

Sie können weitere Parameter mit einem MultiBinding Converter hinzufügen, andernfalls müssen Sie ein AttachedBehavior implementieren –

+0

'ICommand' hat keine' Execute (object, MouseEventArgs) 'Methode. 'MouseBinding' hat einen' ICommand'. Es ruft die 'Execute (object)' Methode auf, die 'ICommand' hat. Es ist nicht so schlau wie du gehofft hast. –

+0

Ich würde sagen, das liegt daran, dass MouseEventArgs kein ViewModel-Objekt ist: Es gehört zur View –

Antwort

1

Wenn Sie nur die Information erhalten möchten, welche Maustaste gedrückt wird, brauchen Sie nicht die MouseEventArgs.

Ändern Sie einfach

if (e.MiddleButton != MouseButtonState.Pressed) return; 

zu

if (Mouse.MiddleButton != MouseButtonState.Pressed) return; 

und Sie sollten gut zu gehen.

In der Tat sind fast alle Eigenschaften und Methoden, die durch MouseEventArgs ausgesetzt sind, auch durch die statische Klasse Mouse ausgesetzt.

+1

Aber all dies sollte bereits durch 'MouseAction =" MiddleClick "' –

+1

@MachineLearning ersetzt werden Ja, es sollte unbedingt. Es ist aber durchaus möglich, dass die 'FileDragDrop'-Methode auch von anderen mausbezogenen Ereignissen aufgerufen wird. – haindl

+0

Danke haindl das hat mein Problem gelöst, danke an alle anderen, die auch geantwortet haben. –

Verwandte Themen