2011-09-06 7 views
1

내 실버 라이트 4 응용 프로그램은 PanelDragDropTarget에 ListBoxDragDropTarget에서 드래그 허용한다.PanelDragDropTarget 및 ListBoxDragDropTarget : 정확히 무엇이 끌리고 있습니까?

응용 프로그램에는 사람을 나타내는 모델 인 Person 개체와 해당 데이터 콘텍스트가 PersonPersonControl 사용자 컨트롤이 있습니다.

참고로 관련 코드는 다음과 같습니다

<toolkit:ListBoxDragDropTarget x:Name="dtListBox" Grid.Row="2" AllowedSourceEffects="Copy" AllowDrop="True" 
           HorizontalContentAlignment="Stretch" 
           VerticalAlignment="Top" VerticalContentAlignment="Stretch"> 
     <!-- FilteredMembers is of type ObservableCollection<Person> --> 
    <ListBox ItemsSource="{Binding FilteredMembers}" 
           MinWidth="42" 
           MinHeight="42"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <my:PersonControl /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
</toolkit:ListBoxDragDropTarget> 

<toolkit:PanelDragDropTarget AllowDrop="True" AllowedSourceEffects="Copy,Move" 
       Drop="PanelDragDropTarget_Current_Drop"> 
    <StackPanel> 
     <ctl:PersonControl Margin="3,3,3,3" x:Name="pcCurrent"></ctl:PersonControl> 
    </StackPanel> 
</toolkit:PanelDragDropTarget> 

지금까지 너무 좋아. PanelDragDropTarget으로 끌면 Person이됩니다.

그러나, 나는 또 다른 PanelDragDropTargetPanelDragDropTarget에서 드래그 할 수 있습니다. 이 경우 Person 대신 삭제 된 개체는 PersonControl입니다.

따라서 떨어 뜨린 개체는 출처에 따라 Person 또는 PersonControl 일 수 있습니다.

PersonControl을 이동하는 대신 모든 경우에 Person 개의 개체를 끌어서 놓기를 정말로하고 싶습니다. 어떻게 PanelDragDropTarget이되도록 드래그가 Person보다는 PersonControl 끌어 수정할 수 있습니다? 나는이 매우 비슷한 질문을 검토 한

:

Drag/drop from ListBoxDragDropTarget to PanelDragDropTarget

하지만이 문제를 해결하는 방법을 이해하지 않습니다.

답변

1

당신은 전송 객체를 떨어 방식 PanelDragDropTargets와 ListBoxDragDropTargets의 차이에 대해 정확하게 맞다. 2 PanelDragDropTargets간에 드래그 것은 UIElement에 전송하는 반면, 사용자가 컨트롤에 바인딩되는 데이터의 일부를 전송하는 2 ListBoxDragDropTargets간에 드래그가 "픽업."

나는이 문제를 얻을 발견하는 가장 좋은 방법은 데이터의 조각은 UIElement에 대신에 드롭 할 것으로 예상 PanelDragDropTarget에서 새 클래스를 파생하는 것입니다. 새 클래스는 데이터 객체를 클래스의/DataContext 클래스에 저장합니다. 이렇게하면 자신과 비슷한 코드가 작동합니다.

클래스 :

public class ElementDragDropTarget : PanelDragDropTarget 
{ 
    protected override bool CanAddItem(Panel itemsControl, object data) 
    { 
     return true; 
    } 

    protected override void InsertItem(Panel itemsControl, int index, object data) 
    { 
     itemsControl.DataContext = data; 
    } 

    protected override bool CanRemove(Panel itemsControl) 
    { 
     return true; 
    } 

    protected override void RemoveItem(Panel itemsControl, object data) 
    { 
     itemsControl.DataContext = null; 
    } 

    protected override void RemoveItemAtIndex(Panel itemsControl, int index) 
    { 
     itemsControl.DataContext = null; 
    } 

    protected override object ItemFromContainer(Panel itemsControl, UIElement itemContainer) 
    { 
     return itemsControl.DataContext; 
    } 
} 

편집 코드에 :

<local:ElementDragDropTarget AllowDrop="True" AllowedSourceEffects="Copy,Move" Drop="PanelDragDropTarget_Current_Drop"> 
    <Grid> 
     <ctl:PersonControl Margin="3,3,3,3" x:Name="pcCurrent"></ctl:PersonControl> 
    </Grid> 
</local:ElementDragDropTarget > 

나는이 솔루션은 하나의 항목 만이 ElementDragDropTarget로 드래그 할 수 있습니다 알고 있습니다. 여러 데이터 객체를 드롭하기를 원한다면 다른 ListBoxDragDropTarget을 사용해야 할 것입니다 (특히 StackPanel을 사용하고 있기 때문에).

관련 문제