UWP Gridview 固定项目位置

UWP Gridview fixed item position

在我的 UWP 应用中,我有这个启用了项目重新排序的 gridview

        <GridView Name="ModulesGridView" CanReorderItems="True" ItemsSource="{x:Bind DataSource, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
 IsItemClickEnabled="False"  IsHoldingEnabled="False" IsTapEnabled="False" AllowDrop="True" Drop="Drop_Module"
 DragOver="Grid_DragOver" ItemTemplateSelector="{StaticResource MyDataTemplateSelector}">           
        </GridView>

并且我希望此 gridview 中的某个项目始终位于末尾,无论我如何重新排序这些项目。它将永远在最后。 有什么办法可以实现吗?

GridView没有原生的API支持这个功能,但是我们可以通过其他方式达到目的。

为简单起见,我们假设您的 DataSourceObservableCollection<int> 类型。如果你的实际类型比int更复杂,你需要提前覆盖这个class的EqualTo方法

1.允许CanDragItems并添加相应的事件

<GridView ...
          CanDragItems="True"
          DragItemsCompleted="ModulesGridView_DragItemsCompleted">
</GridView>

2。加载数据集合时提前提取最后一项

private int LastItem = 0;

...

for (int i = 0; i < 20; i++)
{
    DataSource.Add(i);
}
LastItem = DataSource.Last();

3。检查 DragItemsCompleted 事件中最后一项的位置

private void ModulesGridView_DragItemsCompleted(ListViewBase sender, DragItemsCompletedEventArgs args)
{
    int index = DataSource.IndexOf(LastItem);
    if (index != DataSource.Count - 1)
    {
        DataSource.Move(index, DataSource.Count - 1);
    }
}

换句话说,我们不干预用户重新排序项目的过程,但是在重新排序之后,我们检测最后一个项目的位置。如果不在最后,我们再移动它。

谢谢。