XAML / C#:重新排序gridview后会发生什么事件?

时间:2013-05-05 20:33:25

标签: xaml gridview windows-store-apps winrt-xaml

我正在Visual Studio 2012中创建我的第一个Windows应用商店应用。我有一个gridview控件,我已经启用了重新排序。我有重新排序列表时需要运行的代码。我尝试过Drop事件。它不会开火。我尝试了其他几个拖拽事件,但也没有开火。看起来应该这么简单......谢谢你的时间!

1 个答案:

答案 0 :(得分:23)

除非GridView绑定到ItemsSourceObservableCollectionCanReorderItemsCanDragItems设置为AllowDrop,否则您无法对true重新排序CollectionViewSource。使用gridview启用collectionviewsource中的重新排序需要 。实际上,gridview通常用于对<Grid Background="Black"> <Grid.DataContext> <local:MyModel/> </Grid.DataContext> <GridView CanReorderItems="True" CanDragItems="True" AllowDrop="True" ItemsSource="{Binding Items}"> </GridView> </Grid> 进行分组,并且在对数据进行分组时无法进行重新排序。

无论如何,你的XAML看起来像这样:

enumerable

虽然任何ItemsSource都可以绑定到GridView的{​​{1}},但只有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事件中“删除”操作和“添加”操作的组合。这就是 awesome 的原因。如果只能从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的示例语法:

<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>

祝你好运。