e.data.GetData始终为null
-
07-07-2019 - |
题
我正在使用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。
注意:使用反射来检索私有成员不是一个好习惯。如果他们是私人的,那就有理由。
不隶属于 StackOverflow