【发布时间】:2016-07-20 06:01:56
【问题描述】:
当子对象被从一个容器拖到另一个容器时,我们可以将子对象转换为它的父对象吗?这是我想要做的。
- 我有一个列表框,其中包含派生类 1 和派生类 2 的对象。
- 当我拖动派生类 1 对象并尝试拖放到另一个列表框时,我得到的对象是派生类 1 类型。同样,当我拖动派生类 2 对象时,它是派生类 2。
在将 ItemSource 绑定到 ObservableCollection 的另一个列表框中放置时,我想将这些派生类对象强制转换为基类。
注意:当我将基类与 typeof 运算符与拖动对象一起使用时,我会得到 null。
这是我的 XAML
<GroupBox Header="BaseClassObjects" >
<ListBox SelectedIndex="0" ItemsSource="{Binding BaseClassList}" DisplayMemberPath="Name" PreviewMouseLeftButtonDown="protocol_PreviewMouseLeftButtonDown">
</ListBox>
</GroupBox>
<GroupBox Header="Drop Here" >
<ListBox AllowDrop="True" Drop="ports_Drop">
</ListBox>
</GroupBox>
视图模型中的绑定属性
ObservableCollection<BaseClass> baseClassList = new ObservableCollection<BaseClass>();
public ObservableCollection<BaseClass> BaseClassList
{
get { return baseClassList; }
set { baseClassList = value; }
}
public VM_DragDrop()
{
BaseClassList.Add(new DerivedClassOne() { Name = "Derived Class 1" });
BaseClassList.Add(new DerivedClassTwo() { Name = "Derived Class 2" });
}
基类和派生类
public class BaseClass
{
public string Name { get; set; }
}
public class DerivedClassOne : BaseClass
{
}
public class DerivedClassTwo : BaseClass
{
}
xaml.cs 文件中的事件处理程序
private void protocol_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ListBox listbox = (sender as ListBox);
DragDrop.DoDragDrop(listbox, listbox.SelectedItem, DragDropEffects.Copy);
}
private void ports_Drop(object sender, DragEventArgs e)
{
BaseClass droppedObject = (BaseClass)(e.Data.GetData(typeof(BaseClass)));
(sender as ListBox).Items.Add(droppedObject);
}
这里,当我拖动 Derived Class 1 或 Derived Class 2 时,dropObject 将为空,因为我们通过拖动对象获得的数据是 DerivedClassOne 或 DerivedClassTwo。
请建议我们如何在放置时将这些派生对象转换为父对象。
【问题讨论】:
-
调试的时候能看到
e.Data的内容吗? -
是的。我可以在 e.Data 中看到拖动的对象信息。即当我拖动“Derived Class 1”时,我在 e.Data 中看到“DerivedClassOne”