Pergunta

Eu estou trabalhando com o Visual Studio 2010, o desenvolvimento de uma extensão

Eu preciso arrastar e soltar de um TreeView WPF em um toolwindow para um diagrama DSL mas quando eu chamo e.data.GetData eu não posso obter um valor e quer saber o que estou fazendo de errado

    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);
            }
        }
    }

O primeiro se resolve afirmação como verdadeira. Isso iria me dizer que é esse tipo de objeto. Isto é o que está na vista WPF Tree:

        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);
            }
        }
    }

herda SqlServerTable de mesa. Se eu colocar um ponto de interrupção e chamada

  e.Data.GetFormats()

Eu posso ver meu TypeName totalmente qualificado

Foi útil?

Solução

Eu tenho sido capaz de resolver isso usando reflexão: MSDN Forum Resposta

        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 ;
        }
    }

Outras dicas

Eu não testei seu código, mas eu acho que o problema está no boxing e unboxing. Parece que você tem o tipo errado no evento MouseMove ou DragDrop. Se você deseja receber SqlDataTable você deve enviar SqlDataTable não Table, ou vice-versa. A função GetData () irá retornar nulo se ele pode fazer o casting.

Como Nota: Não é uma boa prática para usar a reflexão para recuperar os membros privados. Se eles são privados, há uma razão para isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top