1

我的页面包含两个 ListView 元素,ListA 和 ListB。您可以通过简单的拖放操作将项目(对象)从 ListA 复制到 ListB。为此,我使用列表的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
            }
        }
4

1 回答 1

1

好的,问题解决了:)

要在同一个 UI 元素(在本例中为 ListView)上使用拖放,您需要禁用CanReorderItems选项。然后我上面提供的代码将起作用。

ListB.CanReorderItems = false;

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

view.VectorChanged += viewVectorChanged;

...

private void viewVectorChanged(Windows.Foundation.Collections.IObservableVector<object> sender, Windows.Foundation.Collections.IVectorChangedEventArgs @event) {

}

由于我的列表绑定到 CollectionViewSource 这对我来说很好。否则 ListView 应该有一个您可以订阅的类似事件。

于 2013-04-05T14:09:30.407 回答