wpf中列表框和数据网格之间的双向拖放

问题描述:

我正在寻找一些实现WPF中ListBox和DataGrid列之间双向拖放功能的帮助。我已经通过网络搜索并设法抓取拖放式样本,但它们不能满足我的需求,而且其中大部分都有一些缺少代码。我的datagrid包含两列说EmployeeName和DepartmentName。这些值来自最初仅用EmployeeName加载的集合。这意味着部门名称栏是空白的。用户可以使用拖放功能选择适当的部门。部门名称在Listbox中加载。部门名称需要从列表框中选择,并拖放到datagrid列中。而Employeename将被映射到部门名称。一旦删除,该部门名称应从列表框中删除,以便它不能映射到其他员工。通过将部门名称从datagrid拖回列表框并重新选择另一个部门名称进行拖放,可以更改映射。wpf中列表框和数据网格之间的双向拖放

我的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> 

的任何链接,示例代码,建议将不胜感激。 问候, 单宝元

我会尝试这样的事:

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

所以你需要的ViewModels - >一个用于网格,另一个用于ListBox并且它们全部实现可标记的IDropable

行为与我在上面发布的codeproject文章中的行为非常相似。

如果您需要进一步的帮助,只需询问;)

+0

非常感谢,迈克。这确实很有帮助。今天我会放手一下,让你知道我是否需要任何进一步的帮助。 – Minal

+0

有没有成功? – Mike1991

+0

是的,几乎没有调整它为我工作。谢谢你的帮助。 – Minal