子があるコンテナから別のコンテナにドラッグされているときに子オブジェクトをその親にキャストできますか?ここに私がやろうとしていることがあります。私は、リストボックスには、私は、派生クラス1のオブジェクトをドラッグして別のリストボックスにドロップしようとすると、私が手オブジェクトが型である派生クラス1のオブジェクトを持つと派生クラス2. ドラッグされたオブジェクトで子オブジェクトを親にキャストする - C#WPF
- 同様に派生クラス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になります。
これらの派生オブジェクトを削除する際に、どのように親にキャストできますかをお勧めします。
デバッグ中に 'e.Data'の内容を確認できますか? – bit
はい。私はe.Dataでドラッグされたオブジェクト情報を見ることができました。つまり、「Derived Class 1」をドラッグすると、e.Dataに「DerivedClassOne」が表示されます –