2017-12-24 20 views
0

Ich habe mehrere Lösungen gefunden, wie RichTextBox mit dragAndDrop-Ereignissen zu verwenden, aber nur wenn ich Methoden in View .cs-Datei platzieren. Ich bin neugierig, ob dies über MVVM möglich ist, indem ich Code in ViewModel einbinde und platziere.C# mvvm Bindungsereignisse auf RichTextBox

So habe ich einfach RichTextBox wo im Versuch, Ereignisse aus der Sicht Modell

<RichTextBox HorizontalAlignment="Left" Height="280" VerticalAlignment="Top" Margin="10,10,10,10" 
       PreviewDragEnter="{Binding RTBPreviewDragEnter}" 
       PreviewDragOver="{Binding RTBPreviewDragEnter}" 
       PreviewDrop="{Binding RTBPreviewDrop}" 
       > 

     <FlowDocument> 
      <Paragraph> 
       <Run Text="RichTextBox"/> 
      </Paragraph> 
     </FlowDocument> 
    </RichTextBox> 

Und Ansichtsmodell zu binden

private Boolean IsFileImage(string fileName) 
    { 
     return true; 
    } 

    public void RTBPreviewDrop(object sender, DragEventArgs e) 
    { 

     if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
     { 
      string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); 
      if (files != null && files.Length > 0) 
      { 
       Console.WriteLine("preview drop"); 
       e.Handled = true; 
      } 
     } 

    } 

    public void RTBPreviewDragEnter(object sender, DragEventArgs e) 
    { 
     string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); 

     if (files != null && files.Length > 0 && files.Where(IsFileImage).Any()) 
     { 
      Console.WriteLine("preview drag enter"); 
      e.Handled = true; 
     } 
    } 

Und wenn ich versuche, dies zu laufen, wirft es Ausnahme, dass Bindung kann nicht in der Eigenschaft AddPreviewDragEnterHandler vom Typ RichTextBox gesetzt sein und DependencyProperty auf DependencyObject verwenden

Gibt es die Möglichkeit, Ereignisse auf RichTextBox über MVVM ohne Abhängigkeit zu binden? (Ich las irgendwo, dass Abhängigkeit nicht gute Idee mit MVVM ist)

Auch ich fand this Frage hier, die das gleiche ist, aber seine Verwendung von Expression Blend SDK. Ist es ein guter Punkt, es zu benutzen?

Oder welcher Ansatz ist in MVVM gut?

Edit: Diese Frage wurde als dupliace markiert, aber in anderen Frage Autor akzeptieren Lösung über Expression Blend SDK erreicht, aber ich war nur neugierig, ob es ohne getan werden kann.

Antwort

0

https://www.codeproject.com/Articles/874425/Drag-and-Drop-in-MVVM-WPF

fand ich das oben angebracht Verhalten wirklich gut zu sein. Ich musste es ein wenig studieren, um herauszufinden, wie es funktioniert, aber es hat sich gelohnt (Sie können ein Beispielprojekt herunterladen). Ich finde es sehr dynamisch und sauber und perfekt für einen MVVM-Ansatz.

Es ist auch ziemlich skalierbar; viel Spielraum gibt es für Erweiterungen, Änderungen, Anpassungen, etc. Zum Beispiel meine aktuelle Version hat eine angeschlossene Eigenschaft CanDropLogic:

delegate bool CanDropLogic(UIElement DropTarget, Point CurrentPosition, Window TopWindow); 

Das bin ich, das Verhalten mit weiteren Logik dynamisch bereitstellen können, wenn meine DropTarget etwas wie ein ListBox, und ich möchte nur in der Lage sein, auf Gegenstände fallen zu lassen, die einem bestimmten Kriterium entsprechen.