2009-09-14 2 views
2

Я работаю с Visual Studio 2010, разработка расширенийe.data.GetData всегда нуль

Мне нужно перетащить из WPF TreeView в ToolWindow на 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); 
      } 
     } 
    } 

Первого, если оператор решает, как 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 наследуется из табл. Если я придерживаюсь контрольной точки в и вызвать

e.Data.GetFormats() 

Я могу видеть мое полностью квалифицированное TypeName

+0

Получаете ли вы что-либо, если вы измените его на «Таблица объектов = e.Data.GetData (typeof (SqlServerTable)); ? – SwDevMan81

+0

, к сожалению, нет. Если я вставлю e.Data.GetData (typeof (SqlServerTable)) в быстрый просмотр, то всегда остается –

ответ

1

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

, кто может объяснить, почему это так сложно для такой очевидной функциональности? почему эти поля являются непубличными?!? – RichardJohnn

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^