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を受信する場合は、TableではなくSqlDataTableを送信する必要があります。逆も同様です。 GetData()関数は、キャストできる場合はnullを返します。
注:リフレクションを使用してプライベートメンバーを取得することはお勧めできません。非公開の場合は、理由があります。
所属していません StackOverflow