将拖动对象中的子对象强制转换为父对象-C#WPF

本文关键字:对象 转换 -C#WPF 拖动 | 更新日期: 2023-09-27 17:57:58

当子对象从一个容器拖到另一个容器时,我们可以将子对象强制转换为其父对象吗?这就是我要做的。

  1. 我有一个列表框,其中包含派生类1和派生类2的对象
  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。

请建议我们如何在删除时将这些派生对象强制转换为父对象。

将拖动对象中的子对象强制转换为父对象-C#WPF

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)

你得到你的基地对象或什么都没有。。。没有对所有已知派生类进行精确测试。