【问题标题】:WPF Drag and Drop multiple listviewitems from listview to a buttonWPF将多个listviewitems从listview拖放到一个按钮
【发布时间】:2017-11-28 02:01:11
【问题描述】:

我有一个属性 SelectionMode 设置为 Extended 的列表视图。

我还有一个垃圾按钮。当用户拖动一个或多个选定项目(如果超过一个项目使用 shift 键)并放下删除按钮时,我正在尝试对列表视图上的选定项目执行删除操作。

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

当在列表视图中选择一个项目并且用户将其从列表视图拖放到删除按钮时,以下代码有效:

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

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

我怎样才能做到这一点,但不是从列表视图中拖放一个项目,而是对多个选定的列表视图项目做同样的事情?一旦掉落,内 btnDelete_Drop 我想遍历所有删除的列表视图项目并做一些事情。

【问题讨论】:

    标签: wpf xaml listview drag-and-drop


    【解决方案1】:

    我刚刚实施了一个可行的解决方案。我已经用这些方法替换了代码隐藏中的 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);
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多