重新排序列表视图项目:事件和拖放

本文关键字:项目 事件 拖放 视图 列表 新排序 排序 | 更新日期: 2023-09-27 18:07:25

我的页面包含两个ListView元素,ListA和ListB。您可以通过简单的拖放操作将项目(对象)从ListA复制到ListB。为此,我使用了Lists的DragItemsStartingDrop事件。这很好。现在您可以对ListB中的项目重新排序。所有必需的属性都设置好了(重新排序,拖放),这也可以工作。

但现在我想对诉诸作出反应,但我没有找到一个我可以听的事件。因此,我认为有可能在同一个列表中使用拖放事件来了解用户何时更改了项目的位置。

那么我怎样才能识别出ListB中的物品已经重新排序了呢?

我的代码(使用拖放方式):

private void ListB_DragItemsStarting(object sender, DragItemsStartingEventArgs e) {
            var item = ((FeedItem)e.Items[0]);
            e.Data.RequestedOperation = DataPackageOperation.Move;
            e.Data.SetDataProvider("FeedItem", request => request.SetData(item));
        }
private async void ListB_Drop(object sender, DragEventArgs e) {
            DataPackageView view = e.Data.GetView();
            if (view.Contains("FeedItem") && view.RequestedOperation == DataPackageOperation.Copy) {
                //item from ListA 
            }
            if (view.Contains("FeedItem") && view.RequestedOperation == DataPackageOperation.Move) {
                //item from ListB
            }
        }

重新排序列表视图项目:事件和拖放

好的,问题解决了:)

要在同一个UI元素(在这个例子中是ListView)上使用拖放,你需要禁用CanReorderItems选项。那么我上面提供的代码就可以工作了。

ListB.CanReorderItems = false;

但是当您希望保留重新排序列表b中的项目的选项时(实际上是我最初的问题),您可以订阅以下事件:

view.VectorChanged += viewVectorChanged;
...
private void viewVectorChanged(Windows.Foundation.Collections.IObservableVector<object> sender, Windows.Foundation.Collections.IVectorChangedEventArgs @event) {
}

因为我的列表被绑定到一个CollectionViewSource,这对我来说很好。否则,ListView应该有一个类似的事件,你可以订阅。