我正在寻找一些帮助在WPF中实现ListBox和DataGrid列之间的双向拖放功能。我已经通过网络搜索并设法抓住拖放样本,但它们无法满足我的需求,而且大多数都缺少一些代码。我的datagrid包含两列,分别是EmployeeName和DepartmentName。这些值来自集合,最初仅使用EmployeeName加载。这意味着departmentname列为空。然后,用户可以使用拖放选择相应的部门。部门名称加载在列表框中。需要从列表框中选择部门名称,将其拖放到数据网格列中。将Employeename映射到部门名称。删除后,应从列表框中删除该部门名称,以使其无法映射到其他员工。可以通过将部门名称从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>
任何链接,示例代码,建议将不胜感激。 问候, 单宝元
答案 0 :(得分: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 - &gt;一个用于网格,一个用于ListBox,所有这些实现 IDragable 和 IDropable 。
这些行为与上面发布的codeproject文章非常相似。
如果您需要进一步的帮助,请询问;)