2016-07-20 19 views
0

子があるコンテナから別のコンテナにドラッグされているときに子オブジェクトをその親にキャストできますか?ここに私がやろうとしていることがあります。私は、リストボックスには、私は、派生クラス1のオブジェクトをドラッグして別のリストボックスにドロップしようとすると、私が手オブジェクトが型である派生クラス1のオブジェクトを持つと派生クラス2. ドラッグされたオブジェクトで子オブジェクトを親にキャストする - C#WPF

  • 持っ

    1. 同様に派生クラス2オブジェクトをドラッグすると派生クラス2となります。

    ItemSourceがのObservableCollectionにバインドさしている別のリストボックスにドロップしますが、私は基本クラスにこれらの派生クラスのオブジェクトをキャストします。

    注:ドラッグしたオブジェクトでtypeof演算子を使用してベースクラスを使用すると、nullが返されます。ここで

    はxaml.csで

    public class BaseClass 
        { 
         public string Name { get; set; } 
        } 
    
        public class DerivedClassOne : BaseClass 
        { 
    
        } 
    
        public class DerivedClassTwo : BaseClass 
        { 
    
        } 
    

    イベントハンドラは、ファイル

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

    Baseのバインドさプロパティと派生クラスで私のXAMLで

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

    ドラッグされたオブジェクトで取得するデータは、DerivedClassOneまたはDerivedClassTwoのいずれかであるため、派生クラス1または派生クラス2をドラッグすると、dropObjectがnullになります。

    これらの派生オブジェクトを削除する際に、どのように親にキャストできますかをお勧めします。

  • +2

    デバッグ中に 'e.Data'の内容を確認できますか? – bit

    +0

    はい。私はe.Dataでドラッグされたオブジェクト情報を見ることができました。つまり、「Derived Class 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) 
    

    あなたはあなたにベースオブジェクトまたは何も...すべての既知の派生クラスの正確なテストなしを取得:

    は、その後、あなたはピックのために、この文字列を使用して、ドロップデータの内容を変換することができます。

    関連する問題