0

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

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

4

1 回答 1

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 个ViewModel -> 一个用于网格,一个用于 ListBox,并且所有这些都实现IDragableIDropable

并且这些行为与我在上面发布的代码项目文章中的行为几乎相同。

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

于 2013-07-12T06:35:55.117 回答