代码之家  ›  专栏  ›  技术社区  ›  falukky

使用itemsource拖放listview wpf失败

  •  0
  • falukky  · 技术社区  · 7 年前

    我有 ListView 使用项源:

    public ObservableCollection<MyObject> List;
    

    还有我的 列表视图 装满了几个东西。

    现在我想添加选项来更改我的 ListViewItems 通过darg我找到了这个解决方案: https://fxmax.wordpress.com/2010/10/05/wpf/

    在项目中添加代码后,我只有一个问题会导致崩溃:

    private void BeginDrag(MouseEventArgs e)
            {
                ListView listView = this.listView;
                ListViewItem listViewItem = FindAnchestor<ListViewItem>((DependencyObject)e.OriginalSource);
    
                if (listViewItem == null)
                    return;
    
                // get the data for the ListViewItem
                MyObject name = (MyObject)listView.ItemContainerGenerator.ItemFromContainer(listViewItem);
    
                //setup the drag adorner.
                InitialiseAdorner(listViewItem);
    
                //add handles to update the adorner.
                listView.PreviewDragOver += listView_PreviewDragOver;
                listView.DragLeave += listView_DragLeave;
                listView.DragEnter += listView_DragEnter;
    
                DataObject data = new DataObject("myFormat", name);
                DragDropEffects de = DragDrop.DoDragDrop(this.listView, data, DragDropEffects.Move);
    
                //cleanup 
                listView.PreviewDragOver -= listView_PreviewDragOver;
                listView.DragLeave -= listView_DragLeave;
                listView.DragEnter -= listView_DragEnter;
    
                if (_adorner != null)
                {
                    AdornerLayer.GetAdornerLayer(listView).Remove(_adorner);
                    _adorner = null;
                }
            }
    

    在这一行:

    DragDropEffects de = DragDrop.DoDragDrop(this.listView, data, DragDropEffects.Move);
    

    system.invalidooperationexception:'操作在 itemsSource正在使用中。使用访问和修改元素 取而代之的是itemscontrol.itemssource。

    我能看到那是因为我在用 ItemSource 但不知道该改变什么。

    有什么建议吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Lupu Silviu    7 年前

    从您在另一个站点上链接的示例代码开始,我做了一些更改,并能够修复解决方案以使用itemssource。

    所做的更改如下: -在mainwindow.xaml中

                <ListView ItemsSource="{Binding List}"
                  x:Name="listView"
    

    -在mainwindow.xaml.cs中

     private void ListViewDrop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent("myFormat"))
            {
                MyObject name = e.Data.GetData("myFormat") as MyObject;
                ListViewItem listViewItem = FindAnchestor<ListViewItem>((DependencyObject)e.OriginalSource);
                ObservableCollection<MyObject> myArray = listView.ItemsSource as ObservableCollection<MyObject>;
    
                if (listViewItem != null && listViewItem.DataContext is MyObject)
                {
                    MyObject dropLocation = (MyObject)listViewItem.DataContext;
                    int index = myArray.IndexOf(dropLocation);
    
                    if (index >= 0)
                    {
                        myArray.Remove(name);
                        myArray.Insert(index, name);
                    }
                }
                else
                {
                    myArray.Remove(name);
                    myArray.Add(name);
                }
            }
        }
    

    private void BeginDrag(MouseEventArgs e)
        {
            ListView listView = this.listView;
            ListViewItem listViewItem =
                FindAnchestor<ListViewItem>((DependencyObject)e.OriginalSource);
    
            if (listViewItem == null)
                return;
    
            MyObject selectedItem = (MyObject)listViewItem.DataContext;
    
            //setup the drag adorner.
            InitialiseAdorner(listViewItem);
    
            //add handles to update the adorner.
            listView.PreviewDragOver += ListViewDragOver;
            listView.DragLeave += ListViewDragLeave;
            listView.DragEnter += ListViewDragEnter;
    
            DataObject data = new DataObject("myFormat", selectedItem);
            DragDropEffects de = DragDrop.DoDragDrop(this.listView, data, DragDropEffects.Move);
    
            //cleanup 
            listView.PreviewDragOver -= ListViewDragOver;
            listView.DragLeave -= ListViewDragLeave;
            listView.DragEnter -= ListViewDragEnter;
    
            if (_adorner != null)
            {
                AdornerLayer.GetAdornerLayer(listView).Remove(_adorner);
                _adorner = null;
            }
        }
    

    这些变化本身使用了 肌体 作为有效负载,而不是字符串,而ObservableCollection作为进行更改的数组,而不是IEnumerable。

    希望这能解决你的问题。