2017-12-24 14 views
0

RichTextBoxをdragAndDropイベントで使用する方法は複数ありますが、View .csファイルにメソッドを配置する場合にのみ使用できます。 MVVMを介してこれが可能で、ViewModelにコードをバインドして配置することが可能であれば興味があります。リッチテキストボックスにイベントをバインドするC#mvvm

だから私はイムビューモデル

<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> 

とViewModelに

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

、私はこれを実行しようとすると、それは ができない結合という例外がスローされますから、イベントをバインドしようとしている簡単なリッチテキストボックスを持っていますRichTextBox型のAddPreviewDragEnterHandlerプロパティで設定し、DependencyObjectでDependencyPropertyを使用する必要があります。

依存関係なしでMVVM経由でRichTextBoxにイベントをバインドする可能性はありますか? (私はどこかでMVVMの依存関係が良いアイデアを読んでいません)

また、ここでも同じですが、使用しているExpression Blend SDKの質問thisが見つかりました。それを使用するのは良い点ですか?

MVVMではどちらのアプローチが良いですか?

編集: この質問にはdupliaceとマークされていましたが、Expression Blend SDKで解決された解決策を受け入れる他の質問がありましたが、それがなくてもそれができるかどうかは不思議でした。

答えて

0

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

私は本当に良いことに上記の添付動作を発見しました。どのように動作するかを理解するために少し勉強しなければなりませんでしたが、それで十分でした(サンプルプロジェクトをダウンロードできます)。私はそれが本当にダイナミックできれいで、MVVMのアプローチに最適であることがわかります。

またスケーラビリティも優れています。これは私のDropTargetが何かあるなら、私は動的にさらにロジックで動作を提供することを可能にする

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

:たとえばなどの機能強化、修正、カスタマイゼーション、の余地がたくさんあるのです、私の現在のバージョンはCanDropLogicの添付プロパティを持っていますListBoxのように、私は特定の基準に一致するアイテムにドロップできるようにしたいだけです。

関連する問題