2013-07-11 7 views
0

WPF의 ListBox와 DataGrid 열 사이에 양방향 끌어서 놓기 기능을 구현하는 데 도움이되는 몇 가지 도움말을 찾고 있습니다. 나는 그물을 통해 수색하고 끌기 하락 견본을 움켜 잡을 수 있었다 그러나 그들은 나의 필요를 성취하지 않는다, 플러스 그들의 대부분은 몇몇없는 부호가있다. 내 DataGrid에는 EmployeeName과 DepartmentName 두 열이 있습니다. 이 값은 처음에는 EmployeeName으로만로드되는 콜렉션에서 가져옵니다. departmentname 컬럼이 비어 있음을 의미합니다. 그런 다음 사용자는 끌어서 놓기를 사용하여 적절한 부서를 선택할 수 있습니다. 부서 이름이 목록 상자에로드됩니다. Departmentname은 Listbox에서 선택해야하며, 데이터 그리드 열에 드레그되고 드롭됩니다. 해당 Employeename은 부서 이름으로 매핑됩니다. 일단 삭제되면 해당 부서 이름을 다른 직원과 매핑 할 수 없도록 목록 상자에서 제거해야합니다. 부서 이름을 DataGrid의 목록 상자로 다시 드래그하고 끌어다 놓기 위해 다른 부서 이름을 다시 선택하여 매핑을 변경할 수 있습니다.wpf의 목록 상자와 DataGrid 간의 양방향 끌어서 놓기

내 Xaml은 이와 비슷합니다. 모든 링크, 샘플 코드, 제안을 이해할 수있을 것이다

<DataGrid x:Name="DatagridEmployeeMapping" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Margin="5,5,5,5" 
    ItemsSource="{Binding ElementName=MWindow, Path=Settings.EmployeeMapping}" GridLinesVisibility="Vertical" AutoGenerateColumns="False" CanUserAddRows="False" IsReadOnly="False" SelectionMode="Single" > 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Employee Name" Binding="{Binding Path=eName}" Width="1*" IsReadOnly="True" /> 
     <DataGridTextColumn Header="Department Name" Binding="{Binding Path=dName}" Width="1*" IsReadOnly="True" /> 
    </DataGrid.Columns> 
    </DataGrid> 

<ListBox x:Name="ListboxDepartmentData" Grid.Column="2" Grid.Row="1" Margin="5,5,5,5" 
    ItemsSource="{Binding ElementName=MWindow, Path=DepartmentDetails}" DisplayMemberPath="Name" ScrollViewer.VerticalScrollBarVisibility="Visible"> 
</ListBox> 

(실제로는 코드에서 직원/부서가 아니라 내가 무엇을 찾고 설명하는 것을 사용했다). 감사 Minal

답변

1

나는 이런 식으로 뭔가를 시도 할 것입니다 :

http://www.codeproject.com/Articles/420545/WPF-Drag-and-Drop-MVVM-using-Behavior

당신은 인터페이스를 조금 확장 할 것이다 :

interface IDragable 
{ 
    Type DataType { get; } 

    // removes the department from the employ if source = grid and if source = listbox it removes the department from the list. 
    void Remove(object i); 

    // returns the department if source = grid and if source = listbox. 
    object GetDataToDrag(); 
} 

interface IDropable 
{ 
    Type DataType { get; } 

    // if target = grid -> set department on current employee, if target = listbox -> add item to listbox. 
    void Drop(object data) 
} 

그래서 당신이 2 ViewModels 필요를 - 하나는 그리드 용이고, 하나는 ListBox 용이고 모두가 구현 됨 IDragableIDropable.

그리고 행동은 위에 게시 된 codeproject 기사와 거의 비슷합니다.

당신은 단순히 물어 그들과 함께 추가 지원이 필요한 경우

)

+0

고마워, 마이크. 이것은 실제로 도움이됩니다. 나는 오늘 가서 그것을 줄 것이고 내가 더 이상의 도움이 필요하면 알려주겠다. – Minal

+0

그걸로 성공 했니? – Mike1991

+0

예, 조금 개조하면 저에게 효과적입니다. 당신의 도움을 주셔서 감사합니다. – Minal