我正在使用Visual Studio 2010,开发扩展程序

我需要从Toolwindow中的WPF TreeView拖放到DSL Diagram上,但是当我调用e.data.GetData时,我无法获得值并想知道我做错了什么

    private void OnDragDrop(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(typeof(SqlServerTable)))
        {
            try
            {
                SqlServerTable table = (SqlServerTable)e.Data.GetData(typeof(SqlServerTable));
                MessageBox.Show(table.Name);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

第一个if语句解析为True。这会告诉我它就是那种对象。 这是WPF树视图中的内容:

        private void DataSourceExplorerTreeView_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            if (DataSourceExplorerTreeView.SelectedValue is TableViewModel)
            {
                Table table = ((TableViewModel)DataSourceExplorerTreeView.SelectedValue).Table;
                DragDrop.DoDragDrop(DataSourceExplorerTreeView, table, DragDropEffects.Copy);
            }
        }
    }

SqlServerTable继承自Table。如果我坚持断点并致电

  e.Data.GetFormats()

我可以看到我的完全限定TypeName

有帮助吗?

解决方案

我已经能够使用反射来解决这个问题: MSDN论坛答疑

        private void OnDragDrop(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(typeof(SqlServerTable)))
        {
          FieldInfo info;

          object obj;

          info = e.Data.GetType().GetField("innerData", BindingFlags.NonPublic | BindingFlags.Instance);

          obj = info.GetValue(e.Data);

          info = obj.GetType().GetField("innerData", BindingFlags.NonPublic | BindingFlags.Instance);

         System.Windows.DataObject dataObj = info.GetValue(obj) as System.Windows.DataObject;

         SqlServerTable table = dataObj.GetData("Project.SqlServerTable") as SqlServerTable ;
        }
    }

其他提示

我没有测试过您的代码,但我认为问题出现在装箱和拆箱中。您似乎在MouseMove或DragDrop事件中有错误的类型。如果要接收SqlDataTable,则应该发送SqlDataTable而不是Table,反之亦然。如果可以进行转换,GetData()函数将返回null。

注意:使用反射来检索私有成员不是一个好习惯。如果他们是私人的,那就有理由。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top