WPF MVVM拖放到另一个控件上以仅引发事件

时间:2009-09-15 21:44:11

标签: wpf mvvm drag-and-drop

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

但是,现在我希望能够将其中一个对象拖放到窗口中的另一个控件上。但是,我不想一定“掉落”对象。我只是希望外部控件实现(通过引发一个事件)它被一个带有ID的对象所淹没。

总结一下,我有2个列表框。一个列表框是收藏夹,另一个是非收藏夹。我可以高兴地在两个列表框之间拖放,一切正常。现在我想将一个喜欢/不喜欢的东西从列表框中拖出并放到另一个控件上。我希望那个控件简单地说“嘿!我刚收到一个喜欢/不喜欢的对象”。

任何想法?

1 个答案:

答案 0 :(得分:0)

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

如果我在“删除”已经选中并拖动的对象(通过装饰图层)时正确记住,那么您实际上是对所选对象的引用。当该对象被“删除”时,“InstanceDroppedOnUserControlFoo_Handler(... args)”事件处理程序对已被删除的对象具有无类型引用。

通过这种方式,您可以进行投射(如果类型已知)并访问您心中的Id字段。

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

如果是这种情况,您将需要浏览这些选项以进行ViewModel通信:

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

然后按照这个过程(或根据您的需求量身定制的东西):

  • 当一个项目被选中并且正在被拖动时,在Drag Source的ViewModel的属性中保持它的引用。
  • 当项目被删除时,发布一条消息“我想要引用正在拖动的所选项目”。
  • Drag Source可以发布一条消息,以响应对被拖动的对象的引用,该对象将由请求的ViewModel接收。

显然,你可以根据自己的需要量身定制参考资料。我将留下最后一个建议,在考虑使用管理这种操作的控制器类时可能是值得的。我看到微软的模式& amp;在WPF CAG (PRISM)样本中与MVVM协调的实践,所以这并非闻所未闻。