Вопрос

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

Мне нужно перетащить объект из 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()

Я вижу мое полное имя 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 () вернет ноль, если сможет выполнить приведение.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top