【问题标题】:Reorder ListView items: Event and Drag/Drop重新排序 ListView 项目:事件和拖放
【发布时间】:2013-04-03 16:17:34
【问题描述】:

我的页面包含两个 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
            }
        }

【问题讨论】:

    标签: c# windows-runtime


    【解决方案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 应该有一个你可以订阅的类似事件。

    【讨论】:

    • 有趣。我有一个ObservableCollection 并且刚刚订阅了CollectionChanging 事件。但我确实需要离开CanReorderItems=True。这篇文章的答案全都有:stackoverflow.com/questions/16388867/…
    猜你喜欢
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    相关资源
    最近更新 更多