2016-07-20 98 views
0

當子對象從一個容器拖到另一個容器時,我們可以將子對象轉換爲父對象嗎?這是我想要做的。將子對象強制轉換爲父對象 - C#WPF

  1. 我有派生類1的對象列表框和派生類2
  2. 當我拖累派生類對象1,並嘗試在另一個列表框砸,我得到的對象類型派生類1.同樣,當我拖動派生類2對象時,它是派生類2。

在DropSource綁定到ObservableCollection的ItemSource的另一個列表框時,我想將這些派生類對象轉換爲Base類。

注意:當我用帶有拖拽對象的typeof運算符使用Base Class時,我得到空值。

這是我的XAML

<GroupBox Header="BaseClassObjects" > 
     <ListBox SelectedIndex="0" ItemsSource="{Binding BaseClassList}" DisplayMemberPath="Name" PreviewMouseLeftButtonDown="protocol_PreviewMouseLeftButtonDown"> 
     </ListBox> 
    </GroupBox> 





    <GroupBox Header="Drop Here" > 
       <ListBox AllowDrop="True" Drop="ports_Drop"> 
       </ListBox> 
      </GroupBox> 

在視圖模型

ObservableCollection<BaseClass> baseClassList = new ObservableCollection<BaseClass>(); 

     public ObservableCollection<BaseClass> BaseClassList 
     { 
      get { return baseClassList; } 
      set { baseClassList = value; } 
     } 

public VM_DragDrop() 
     { 
      BaseClassList.Add(new DerivedClassOne() { Name = "Derived Class 1" }); 
      BaseClassList.Add(new DerivedClassTwo() { Name = "Derived Class 2" }); 
     } 

基地綁定屬性和派生類在xaml.cs

public class BaseClass 
    { 
     public string Name { get; set; } 
    } 

    public class DerivedClassOne : BaseClass 
    { 

    } 

    public class DerivedClassTwo : BaseClass 
    { 

    } 

事件處理程序文件

private void protocol_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      ListBox listbox = (sender as ListBox); 
      DragDrop.DoDragDrop(listbox, listbox.SelectedItem, DragDropEffects.Copy); 
     } 

private void ports_Drop(object sender, DragEventArgs e) 
     { 
      BaseClass droppedObject = (BaseClass)(e.Data.GetData(typeof(BaseClass))); 
      (sender as ListBox).Items.Add(droppedObject); 

    } 

這裏,只要拖動派生類1或派生類2,droppedObject就會爲空,因爲數據我們通過拖動對象獲得的是DerivedClassOne或DerivedClassTwo。

請建議如何在丟棄時將這些派生對象轉換爲父項。

+2

您可以在調試時看到e.Data的內容嗎? – bit

+0

是的。我可以在e.Data中看到拖動的對象信息。即當我拖動「派生類1」時,我會在e.Data中看到「DerivedClassOne」 –

回答

0

DragEventArgs有一個.GetFormats函數返回一個字符串數組,每個字符串指定該數據對象支持的格式的名稱。

然後你可以使用這個字符串回暖和轉換降數據內容:

Dim tmpTypes() As String = e.Data.GetFormats 
Dim tmpTyp As String = tmpTypes(0) 
Dim dropper As MyObjectBase = TryCast(e.Data.GetData(tmpTyp), MyObjectBase) 

你得到你的基本對象或沒有......沒有所有已知的派生類的精確檢驗。