2

我正在使用 Visual Studio 2010,开发一个扩展

我需要从 Toolwindow 中的 WPF TreeView 拖放到 DSL 图上,但是当我调用 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()

我可以看到我的完全限定类型名

4

2 回答 2

1

I have been able to solve this using reflection: MSDN Forum Answer

        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 ;
        }
    }
于 2009-09-16T07:37:51.487 回答
0

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

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

于 2014-01-17T21:11:35.243 回答