有一个类Action代表某种动作。此操作还可以包含一组嵌套操作ChildAction。
public class Action
{
public Action Parent {get;set;}
public ObservableCollection<Action> ChildActions {get;set;}
}
该类ProjectVM是动作的集合Action:
public class ProjectVM : BaseVM
{
public ObservableCollection<Action> Actions {get;set;}
}
BMainVM有一个存储活动项目的属性:
public class MainVM : BaseVM
{
public ProjectVM SelectedProject{get;set;}
}
在界面部分ProjectVM中,呈现TreeView了其元素的集合,Actions这些元素可以相互拖动和嵌套。
拖放是使用GongSolutions.Wpf.DragDrop 实现的。
我需要知道哪个元素被移动到哪里以形成每个ProjectVM.
Drag&Drop但是如何挂接到SelectedProjectMVVM 中的处理程序,这些处理程序在整个生态系统之外,并且只是使用附加属性挂接到控件?
<TreeView dd:DragDrop.UseDefaultDragAdorner="True"
dd:DragDrop.IsDragSource="True"
dd:DragDrop.IsDropTarget="True"
dd:DragDrop.DropHandler="{Binding ElementName=UserControl, Path=DropHandler}"
ItemsSource="{Binding Actions}" />
public class DropHandler : IDropTarget
{
//...
public void Drop(IDropInfo dropInfo)
{
//Здесь нужно взаимодействие с SelectedProject
}
}
当然,您可以将属性SelectedProject设为静态,但有些东西告诉我这是错误的。
也许这是错误的方法?
使用信使在您的 VM 之间发送消息(读取 - 启动事件)。在放置处理程序代码中,您调用一个事件,在您需要的模型中,处理此事件并保存操作历史记录。为此,您可以使用事件代理。一个非常方便的 API,允许您在应用程序类之间提供低级别的耦合。