e.data.GetData всегда нулевой

Я работаю с Visual Studio 2010, разрабатываю расширение

Мне нужно перетащить из дерева элементов WPF в окне инструментов на диаграмму 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()

Я вижу мое полное имя TypeName

2 ответа

Решение

Я смог решить эту проблему с помощью отражения: 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 ;
        }
    }

Я не проверял ваш код, но я думаю, что проблема в упаковке и распаковке. Кажется, у вас неправильный тип в событии MouseMove или DragDrop. Если вы хотите получить SqlDataTable, вы должны отправить SqlDataTable не Table, или наоборот. Функция GetData() вернет ноль, если сможет выполнить приведение.

Как примечание: не рекомендуется использовать рефлексию для извлечения приватных членов. Если они являются частными, есть причина для этого.

Другие вопросы по тегам