WPF将listview中的多个listviewitem拖放到一个按钮

时间:2017-06-24 17:43:23

标签: wpf xaml listview drag-and-drop

我有一个listview,其属性SelectionMode设置为Extended。

我也有一个垃圾按钮。我试图在列表视图上的所选项目上执行删除操作,当用户拖动一个或多个所选项目时(如果有多个项目则使用shift键)并删除删除按钮。

我已在listview中使用单个选定项目实现它,它可以正常工作。现在我尝试对listview中的多个选定项目执行相同操作但没有成功。

下面的代码适用于在listview中选择一个项目并且用户将其从listview拖放到删除按钮时:

    <ListView Margin="10" Name="lvUsers" ItemsSource="{Binding Path=Items}" SelectionMode="Extended">
                        <ListView.ItemContainerStyle>
                            <Style TargetType="ListViewItem">                                                               
                                <EventSetter Event="MouseMove"  Handler="lstItems_MouseMove" />
                            </Style>
                        </ListView.ItemContainerStyle>

                        <!-- other stuff -->

    </Listview>

    <Button  AllowDrop="True"  Drop="btnDelete_Drop" Height="64" Width="64" Margin="10" Click="BtnDelete_Click" Content="Delete"/>

和代码隐藏:

    private void lstItem_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            if (e.Source != null)
            {
                DataModel selectedItem = (DataModel)lvUsers.SelectedItem;

                DragDrop.DoDragDrop(lvUsers, selectedItem, DragDropEffects.Move);                  
            }
        }
    }


    private void btnDelete_Drop(object sender, DragEventArgs e)
    {
        Type myType = typeof(DataModel);
        string modelns = myType.FullName;

        DataModel selectedItem = e.Data.GetData(modelns) as DataModel;
        MessageBox.Show(selectedItem.Name);

    }

listview上的每个listviewitem都是以下数据类型:

   public class DataModel
    {
        public string Name
        {
            get;
            set;
        }

        public int Age
        {
            get;
            set;
        }

        public string Mail
        {
            get;
            set;
        }
    }

例如,当用户将拖动的listviewitem放在删除按钮上时,我会显示一个带有该人姓名的消息框。

如何执行相同的操作,而不是从listview中拖放单个项目,对多个选定的listviewitems执行相同的操作?一旦掉线,在内 btnDelete_Drop我想迭代所有删除的listviews项目并做一些事情。

1 个答案:

答案 0 :(得分:0)

我刚刚实施了一个有效的解决方案。我在代码隐藏中替换了方法lstItem_MouseMove和btnDelete_Drop:

private void lstItem_MouseMove(object sender, MouseEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        if (e.Source != null)
        {
                List<DataModel> myList = new List<DataModel>();
                foreach (DataModel Item in lvUsers.SelectedItems)
                {
                    myList.Add(Item);
                }                 

                DataObject dataObject = new DataObject(myList);                    
                DragDrop.DoDragDrop(lvUsers, dataObject, DragDropEffects.Move);               
        }
    }
}


private void btnDelete_Drop(object sender, DragEventArgs e)
{
        Type myType = typeof(List<DataModel>);

        List<DataModel> selectedItems = e.Data.GetData(myType) as List<DataModel>;

        string hello = "Hello ";
        foreach (DataModel dm in selectedItems)
        {
            hello = hello + ", " + dm.Name;
        }

        MessageBox.Show(hello);
}

这是有效的,但可能还有其他更好的解决方案。欢迎提出任何建议。