12

我正在 Visual Studios 2012 中制作我的第一个 Windows 应用商店应用程序。我有一个已启用重新排序的 gridview 控件。我有在重新排序列表时需要运行的代码。我已经尝试过 Drop 事件。它不火。我尝试了其他几个拖动事件,也没有触发。看起来这应该很简单......感谢您的时间!

4

1 回答 1

23

GridView除非aItemsSource绑定到ObservableCollectionand CanReorderItems,否则不能重新排序 a CanDragItems,并且AllowDrop设置为true不必使用 a来CollectionViewSource启用您的gridview. 实际上,acollectionviewsource经常用于对 a 进行分组,gridview并且在对数据进行分组时无法重新排序。

无论如何,您的 XAML 将如下所示:

<Grid Background="Black">
    <Grid.DataContext>
        <local:MyModel/>
    </Grid.DataContext>
    <GridView CanReorderItems="True" CanDragItems="True" AllowDrop="True"
              ItemsSource="{Binding Items}">
    </GridView>
</Grid>

尽管 anyenumerable可以绑定到ItemsSourcea GridView,但它只有一个ObservableCollection可以重新排序。是的,您可以使用实现重新排序的自定义类型,但为什么要在ObservableCollection什么时候为您解决这个问题呢?

您的视图模型可能如下所示:

public class MyModel
{
    public MyModel()
    {
        foreach (var item in Enumerable.Range(1, 50))
            Items.Add(item);
        Items.CollectionChanged += Items_CollectionChanged;
    }

    ObservableCollection<int> m_Items = new ObservableCollection<int>();
    public ObservableCollection<int> Items { get { return m_Items; } }

    object m_ReorderItem;
    int m_ReorderIndexFrom;
    void Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        switch (e.Action)
        {
            case NotifyCollectionChangedAction.Remove:
                m_ReorderItem = e.OldItems[0];
                m_ReorderIndexFrom = e.OldStartingIndex;
                break;
            case NotifyCollectionChangedAction.Add:
                if (m_ReorderItem == null)
                    return;
                var _ReorderIndexTo = e.NewStartingIndex;
                HandleReorder(m_ReorderItem, m_ReorderIndexFrom, _ReorderIndexTo);
                m_ReorderItem = null;
                break;
        }
    }

    void HandleReorder(object item, int indexFrom, int indexTo)
    {
        Debug.WriteLine("Reorder: {0}, From: {1}, To: {2}", item, indexFrom, indexTo);
    }
}

在上面的代码中,重新排序event不是真实的。它源自CollectionChanged事件中的“删除”操作和“添加”操作的组合。这就是为什么这很棒。如果重新订购只能从 那里获得,GridView那么ViewModel将无法处理它。因为基础列表是您检测重新排序的方式,所以ViewModel启用了。

每个案例都略有不同。您可能不关心索引,因此您可以简化代码。您可能不允许从集合中添加或删除,因此您只需要监视添加操作。同样,这取决于您的情况。我上面的示例代码应该可以处理 99% 的案例。

请记住,GridView不是唯一允许重新排序的控件。任何基于ListViewBase(如ListView)的控件都支持重新排序 - 仍在使用ObservableCollection. 但GridView最常用的控件是使用此功能。当然。

参考:http: //msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.listviewbase.canreorderitems

哦,回答你的问题!

没有表明重新排序的事件。重新排序是基于基础ObservableCollection CollectionChanged事件中的操作组合的派生操作。有道理?

顺便说一句CollectionViewSource,如果您选择,这里是绑定到 a 的示例语法:

<Grid Background="Black">
    <Grid.DataContext>
        <local:MyModel/>
    </Grid.DataContext>
    <Grid.Resources>
        <CollectionViewSource x:Name="CVS" Source="{Binding Items}" />
    </Grid.Resources>
    <GridView CanReorderItems="True" CanDragItems="True" AllowDrop="True"
              ItemsSource="{Binding Source={StaticResource CVS}}" >
    </GridView>
</Grid>

祝你好运。

于 2013-05-08T17:00:14.393 回答