WPF+MVVMでドラッグ&ドロップの実装
はじめに
WPF+MVVMでリストにドラッグ&ドロップを実装するための方法です。
方法
実装にあたっては、MVVMの作法に則るために、コードビハインド(xaml.cs
)には何も書きたくありません。
このためには、GongSolutions.WPF.DragDropを利用するのが楽です。
これはNugetからインストールすることもできます。
使い方
View側
まず、xamlの名前空間に下記を追加します。
xmlns:dd="urn:gong-wpf-dragdrop"
さらに、ドラッグアンドドロップをしたい ListBox
などに対して、次のプロパティを追加します。
<ListBox ItemsSource="{Binding Files}"
dd:DragDrop.IsDropTarget="True"
dd:DragDrop.DropHandler="{Binding}"/>
- 注意
-
Files
は、ViewModelの定義に応じて適切なプロパティ名に変更する -
DropHandler="{Binding}"
は、DropHandler
に現在のDataContext
をバインドするという意味
-
ViewModel側
ViewModel では GongSolutions.Wpf.DragDrop.IDropTarget
インターフェースを実装すればOKです。
下記の例では、リストにzipファイルのパスを列挙する機能を実装しています。
using GongSolutions.Wpf.DragDrop;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
class SampleWindowViewModel : IDropTarget
{
public ObservableCollection<string> Files { get; } = new ObservableCollection<string>();
public void DragOver(IDropInfo dropInfo)
{
var files = ((DataObject)dropInfo.Data).GetFileDropList().Cast<string>();
dropInfo.Effects = files.Any(fname => fname.EndsWith(".zip"))
? DragDropEffects.Copy : DragDropEffects.None;
}
public void Drop(IDropInfo dropInfo)
{
var files = ((DataObject)dropInfo.Data).GetFileDropList().Cast<string>()
.Where(fname => fname.EndsWith(".zip")).ToList();
if (files.Count == 0) return;
foreach (var file in files)
Files.Add(file);
}
}
- 注意
-
IDropTarget
はSystem.Windows.Forms
にも同名のインターフェースが存在するため、参照先を間違えないようにする -
DragOver
はドラッグした状態でリストにマウスオーバーしたときに実行されるメソッド -
Drop
はDragOver
状態でマウスボタンを離したときに実行されるメソッド
-
以上で、ドラッグ&ドロップ機能を持つ ListBox
の実装が完了しました。
まとめ
GongSolutions.WPF.DragDropを利用すれば、MVVMの作法で簡単にドラッグ&ドロップを実装できます。
Author And Source
この問題について(WPF+MVVMでドラッグ&ドロップの実装), 我々は、より多くの情報をここで見つけました https://qiita.com/tmokmss/items/cf58a1d5cbe6cd5b3155著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .