使用ScatterView在MVVM中拖放

Ric*_*ire 6 wpf drag-and-drop mvvm pixelsense

我正在尝试在使用MVVM模式构建的Surface应用程序中实现拖放功能.我在努力想出一种在坚持MVVM模式的同时实现这一目标的方法.虽然我试图在Surface应用程序中执行此操作,但我认为该解决方案通用性足以应用于WPF.

我正在尝试生成以下功能:

  • 用户联系ScatterViewItem中的FrameworkElement以开始拖动操作(ScatterViewItem的特定部分启动拖放功能)
  • 当拖动操作开始时,会创建该ScatterViewItem的副本并将其强加于原始ScatterViewItem,该副本将是用户将拖动并最终删除的内容
  • 用户可以将项目放到另一个ScatterViewItem(放在单独的ScatterView中)

整体交互非常类似于Surface SDK中提供的ShoppingCart应用程序,除了源对象包含在ScatterView而不是ListBox中.

我不确定如何继续以便在我的ViewModel之间进行正确的通信以提供此功能.我遇到的主要问题是当用户联系FrameworkElement时复制ScatterViewItem.

小智 4

您可以使用附加属性。创建一个附加属性并在 setproperty 方法中绑定到 droped 事件:


public static void SetDropCommand(ListView source, ICommand command)
        {
            source.Drop += (sender, args) =>
                               {
                                   var data = args.Data.GetData("FileDrop");
                                   command.Execute(data);
                               };
        }
Run Code Online (Sandbox Code Playgroud)

然后,您可以将视图模型中的命令绑定到视图上的相关控件。显然,您可能希望将附加属性应用于特定的控件类型而不是列表视图。

希望有帮助。