将拖动对象中的子对象强制转换为父对象-C#WPF
本文关键字:对象 转换 -C#WPF 拖动 | 更新日期: 2023-09-27 17:57:58
当子对象从一个容器拖到另一个容器时,我们可以将子对象强制转换为其父对象吗?这就是我要做的。
- 我有一个列表框,其中包含派生类1和派生类2的对象
- 当我拖动Derived class 1对象并尝试将其放到另一个列表框时,我得到的对象属于Derived class 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);
}
这里,每当我拖动派生类1或派生类2时,droppedObject都将为null,因为我们通过拖动对象得到的数据是DerivedClassOne或DerivedCClassTwo。
请建议我们如何在删除时将这些派生对象强制转换为父对象。
DragEventArgs有一个。GetFormats函数返回一个字符串数组,每个字符串指定此数据对象支持的格式的名称。
然后,您可以使用此字符串来提取和转换投递数据内容:
Dim tmpTypes() As String = e.Data.GetFormats
Dim tmpTyp As String = tmpTypes(0)
Dim dropper As MyObjectBase = TryCast(e.Data.GetData(tmpTyp), MyObjectBase)
你得到你的基地对象或什么都没有。。。没有对所有已知派生类进行精确测试。