首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ScatterView在MVVM中拖放

用ScatterView在MVVM中拖放
EN

Stack Overflow用户
提问于 2009-06-23 18:42:38
回答 2查看 8.2K关注 0票数 6

我试图在使用MVVM模式构建的Surface中实现拖放功能。我很难在坚持MVVM模式的同时,想出一种方法来实现这一点。虽然我试图在中这样做,但我认为该解决方案足够通用,也适用于WPF。

我试图产生以下功能:

  • 用户在ScatterViewItem中联系一个FrameworkElement以开始拖动操作( ScatterViewItem的一个特定部分启动拖放ScatterViewItem )拖动操作开始创建ScatterViewItem的副本并强加给原始ScatterViewItem,该复制是用户将拖放
  • 的副本,用户可以将该项目拖放到另一个ScatterViewItem(放置在单独的ScatterView中)

总体交互与Surface中提供的ShoppingCart应用程序非常相似,只是源对象包含在ScatterView中而不是ListBox中。

我不确定如何继续工作,以便在我的ViewModels之间启用适当的通信,以便提供此功能。我遇到的主要问题是当用户与ScatterViewItem联系时复制FrameworkElement。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-03 19:52:12

你可以使用附加的财产。创建附加属性,并在setproperty方法中绑定到下拉事件:

代码语言:javascript
复制
public static void SetDropCommand(ListView source, ICommand command)
        {
            source.Drop += (sender, args) =>
                               {
                                   var data = args.Data.GetData("FileDrop");
                                   command.Execute(data);
                               };
        }

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

希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2011-01-28 16:03:27

我试着让史蒂夫·普萨蒂斯的想法奏效。这需要一段时间--自定义依赖属性很容易出错。在我看来,SetXXX是放你的副作用的错误的地方-- WPF不需要去那里,它可以直接去DependencyObject.SetValue,但是PropertyChangedCallback总是被调用的。

因此,下面完成并处理自定义附加属性的代码:

代码语言:javascript
复制
using System.Windows;
using System.Windows.Input;

namespace WpfApplication1
{
    public static class PropertyHelper
    {
        public static readonly DependencyProperty DropCommandProperty = DependencyProperty.RegisterAttached(
            "DropCommand",
            typeof(ICommand),
            typeof(PropertyHelper),
            new PropertyMetadata(null, OnDropCommandChange));

        public static void SetDropCommand(DependencyObject source, ICommand value)
        {
            source.SetValue(DropCommandProperty, value);
        }

        public static ICommand GetDropCommand(DependencyObject source)
        {
            return (ICommand)source.GetValue(DropCommandProperty);
        }

        private static void OnDropCommandChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ICommand command = e.NewValue as ICommand;
            UIElement uiElement = d as UIElement;
            if (command != null && uiElement != null)
            {
                uiElement.Drop += (sender, args) => command.Execute(args.Data);
            }

            // todo: if e.OldValue is not null, detatch the handler that references it
        }
    }
}

在您想要使用它的XAML标记中,可以这样做。

代码语言:javascript
复制
xmlns:local="clr-namespace:WpfApplication1"
...
<Button Content="Drop here" Padding="12" AllowDrop="True"
   local:PropertyHelper.DropCommand="{Binding DropCommand}" />

。。剩下的只是确保您的ViewModel、绑定和命令是正确的。

这个版本将一个IDataObject传递给命令,这在我看来更好--您可以在命令中查询它的文件或任何内容。但这只是目前的一种偏好,而不是答案的一个基本特征。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1034374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档