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

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

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

  • 除了源对象包含在ScatterView中而不是ListBox中之外,整个交互过程与Surface SDK中提供的ShoppingCart应用程序非常相似。

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

    最佳答案

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

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

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

    希望能有所帮助。

    关于wpf - 使用ScatterView在MVVM中拖放,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1034374/

    10-11 03:45