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支持这个功能,但是我们可以通过其他方式达到目的。
为简单起见,我们假设您的 DataSource
是 ObservableCollection<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);
}
}
换句话说,我们不干预用户重新排序项目的过程,但是在重新排序之后,我们检测最后一个项目的位置。如果不在最后,我们再移动它。
谢谢。
在我的 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支持这个功能,但是我们可以通过其他方式达到目的。
为简单起见,我们假设您的 DataSource
是 ObservableCollection<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);
}
}
换句话说,我们不干预用户重新排序项目的过程,但是在重新排序之后,我们检测最后一个项目的位置。如果不在最后,我们再移动它。
谢谢。