【问题标题】:WPF MVVM Drag and Drop onto another Control to raise an event onlyWPF MVVM 拖放到另一个控件上以仅引发事件
【发布时间】:2009-09-15 21:44:11
【问题描述】:

我有两个 ListBox,其中包含对象作为填充它们的 ItemsSource。现在,我正在使用 DragDropHelper 让我将一个对象从一个 ListBox 拖到第二个 ListBox。我运行自定义代码来更改对象的属性并更新我的两个 ListBox 对象集合。

但是,现在我希望能够将其中一个对象拖放到窗口中的另一个控件上。但是,我不一定要“删除”该对象。我只想让外部控件(通过引发事件)意识到它刚刚被具有 ID 的对象拖放到上面。

回顾一下,我有 2 个列表框。一个列表框是收藏夹,另一个是非收藏夹。我可以愉快地在两个列表框之间拖放,一切正常。现在我想从列表框中拖出最喜欢的/不喜欢的并将它放到另一个控件上。我希望该控件可以简单地说“嘿!我刚刚有一个喜欢/不喜欢的对象掉在我身上”。

有什么想法吗?

【问题讨论】:

    标签: wpf mvvm drag-and-drop


    【解决方案1】:

    我去年做了类似的事情(.NET .3.5)。

    如果我没记错的话,当您“放置”一个已被选中并拖动的对象(通过装饰层)时,您实质上是持有对所选对象的引用。当该对象被“删除”时,“InstanceDroppedOnUserControlFoo_Handler(... args)”事件处理程序对已删除的对象有一个无类型的引用。

    您可以从中转换(如果类型已知)并访问 Id 字段以获取您的心内容。

    现在的问题是,放置目标用户控件在其 DataContext 中是否与 Drag Source 共享相同的 ViewModel?在大多数情况下,如果不是这种情况,您将不会在事件 args 中获得引用,您将获得 null。

    如果是这种情况,您将需要探索这些用于 ViewModel 间通信的选项:

    使用 MVVM 消息传递框架 (MVVM Light Framework see Messenger component) 要么 通过 WPF Prism 发布订阅复合事件 - EventAggregator:

    然后按照这个过程(或更适合您的需要):

    • 当一个项目被选中并被拖动时,将其引用保存在拖动源的 ViewModel 的属性中。
    • 当项目被放下时,发布一条消息说“我想要对被拖动的选定项目的引用”。
    • Drag Source 可以发布消息以响应对被拖动对象的引用,请求 ViewModel 将收到该引用。

    显然,此时您可以根据自己的需要调整参考持有量。我会给你最后一个建议,考虑使用管理这种操作的控制器类可能是值得的。我在WPF CAG (PRISM) 示例中看到了 Microsoft 的 Patterns & Practices 与 MVVM 配合使用的控制器,因此它并非闻所未闻。

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      相关资源
      最近更新 更多