CSHARP
datagrid drop file wpf mvvm example
<ScrollViewer AllowDrop="True" Background="Transparent" utility:FileDragDropHelper.IsFileDragDropEnabled="True" utility:FileDragDropHelper.FileDragDropTarget="{Binding}"/>
datagrid drop file wpf mvvm example
/// <summary>
/// IFileDragDropTarget Interface
/// </summary>
public interface IFileDragDropTarget
{
void OnFileDrop(string[] filepaths);
}
/// <summary>
/// FileDragDropHelper
/// </summary>
public class FileDragDropHelper
{
public static bool GetIsFileDragDropEnabled(DependencyObject obj)
{
return (bool)obj.GetValue(IsFileDragDropEnabledProperty);
}
public static void SetIsFileDragDropEnabled(DependencyObject obj, bool value)
{
obj.SetValue(IsFileDragDropEnabledProperty, value);
}
public static bool GetFileDragDropTarget(DependencyObject obj)
{
return (bool)obj.GetValue(FileDragDropTargetProperty);
}
public static void SetFileDragDropTarget(DependencyObject obj, bool value)
{
obj.SetValue(FileDragDropTargetProperty, value);
}
public static readonly DependencyProperty IsFileDragDropEnabledProperty =
DependencyProperty.RegisterAttached("IsFileDragDropEnabled", typeof(bool), typeof(FileDragDropHelper), new PropertyMetadata(OnFileDragDropEnabled));
public static readonly DependencyProperty FileDragDropTargetProperty =
DependencyProperty.RegisterAttached("FileDragDropTarget", typeof(object), typeof(FileDragDropHelper), null);
private static void OnFileDragDropEnabled(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue == e.OldValue) return;
var control = d as Control;
if (control != null) control.Drop += OnDrop;
}
private static void OnDrop(object _sender, DragEventArgs _dragEventArgs)
{
DependencyObject d = _sender as DependencyObject;
if (d == null) return;
Object target = d.GetValue(FileDragDropTargetProperty);
IFileDragDropTarget fileTarget = target as IFileDragDropTarget;
if (fileTarget != null)
{
if (_dragEventArgs.Data.GetDataPresent(DataFormats.FileDrop))
{
fileTarget.OnFileDrop((string[])_dragEventArgs.Data.GetData(DataFormats.FileDrop));
}
}
else
{
throw new Exception("FileDragDropTarget object must be of type IFileDragDropTarget");
}
}
}
datagrid drop file wpf mvvm example
void ButtonClicked(object sender, EventArgs e)
{
((MyViewModel) this.DataContext).DoSomething();
}
datagrid drop file wpf mvvm example
public interface IFilesDropped
{
void OnFilesDropped(string[] files);
}
datagrid drop file wpf mvvm example
public class SomeViewModel : IFilesDropped
{
public void OnFilesDropped(string[] files)
{
// Implement some logic here
}
}
datagrid drop file wpf mvvm example
public class DropFilesBehaviorExtension
{
public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached(
"IsEnabled", typeof(bool), typeof(DropFilesBehaviorExtension), new FrameworkPropertyMetadata(default(bool), OnPropChanged)
{
BindsTwoWayByDefault = false,
});
private static void OnPropChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is FrameworkElement fe))
throw new InvalidOperationException();
if ((bool)e.NewValue)
{
fe.AllowDrop = true;
fe.Drop += OnDrop;
fe.PreviewDragOver += OnPreviewDragOver;
}
else
{
fe.AllowDrop = false;
fe.Drop -= OnDrop;
fe.PreviewDragOver -= OnPreviewDragOver;
}
}
private static void OnPreviewDragOver(object sender, DragEventArgs e)
{
// NOTE: PreviewDragOver subscription is required at least when FrameworkElement is a TextBox
// because it appears that TextBox by default prevent Drag on preview...
e.Effects = DragDropEffects.Move;
e.Handled = true;
}
private static void OnDrop(object sender, DragEventArgs e)
{
var dataContext = ((FrameworkElement)sender).DataContext;
if (!(dataContext is IFilesDropped filesDropped))
{
if (dataContext != null)
Trace.TraceError($"Binding error, '{dataContext.GetType().Name}' doesn't implement '{nameof(IFilesDropped)}'.");
return;
}
if (!e.Data.GetDataPresent(DataFormats.FileDrop))
return;
if (e.Data.GetData(DataFormats.FileDrop) is string[] files)
filesDropped.OnFilesDropped(files);
}
public static void SetIsEnabled(DependencyObject element, bool value)
{
element.SetValue(IsEnabledProperty, value);
}
public static bool GetIsEnabled(DependencyObject element)
{
return (bool)element.GetValue(IsEnabledProperty);
}
}
datagrid drop file wpf mvvm example
<TextBox ns:DropFilesBehaviorExtension.IsEnabled ="True" />