uwp - UWP:绑定和添加新项目的问题
问题描述
所以我使用的是 uwp datagrid 控件,这个:https ://docs.microsoft.com/en-us/windows/communitytoolkit/controls/datagrid
我的网格的 ItemsSource 绑定到 ObservableCollection。用户可以单击添加按钮,将新项目插入到集合中:AllPlans.Insert(0, newLessonPlan);
一开始它工作得很好,直到用户点击一个改变集合的切换控件,切换事件:
private void ToggleOldEvents_Toggled(object sender, RoutedEventArgs e)
{
AllPlans = new ObservableCollection<Entities.LessonPlan>(PlanController.GetAll(((Entities.AppUser)UserBox.SelectedItem).id, ToggleOldEvents.IsOn).OrderByDescending(p => p.DateTimeFrom));
PlansGrid.ItemsSource = AllPlans;
foreach (var col in PlansGrid.Columns)
{
col.SortDirection = null;
}
}
然后,当用户尝试向集合中添加另一个项目时,它会跌倒在AllPlans.Insert(0, newLessonPlan);
说索引 0 超出范围。
堆栈跟踪:
at System.ThrowHelper.ThrowArgumentOutOfRange_IndexException()
at System.Collections.Generic.List`1.RemoveAt(Int32 index)
at Microsoft.Toolkit.Uwp.UI.Controls.DataGridInternals.DataGridDisplayData.UnloadScrollingElement(Int32 slot, Boolean updateSlotInformation, Boolean wasDeleted)
at Microsoft.Toolkit.Uwp.UI.Controls.DataGrid.RemoveNonDisplayedRows(Int32 newFirstDisplayedSlot, Int32 newLastDisplayedSlot)
at Microsoft.Toolkit.Uwp.UI.Controls.DataGrid.UpdateDisplayedRows(Int32 newFirstDisplayedSlot, Double displayHeight)
at Microsoft.Toolkit.Uwp.UI.Controls.DataGrid.ComputeScrollBarsLayout()
at Microsoft.Toolkit.Uwp.UI.Controls.DataGrid.OnAddedElement_Phase2(Int32 slot, Boolean updateVerticalScrollBarOnly)
at Microsoft.Toolkit.Uwp.UI.Controls.DataGrid.InsertRowAt(Int32 rowIndex)
at Microsoft.Toolkit.Uwp.UI.Data.Utilities.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
at Microsoft.Toolkit.Uwp.UI.Data.Utilities.ListCollectionView.ProcessCollectionChangedWithAdjustedIndex(EffectiveNotifyCollectionChangedAction action, Object oldItem, Object newItem, Int32 adjustedOldIndex, Int32 adjustedNewIndex)
at Microsoft.Toolkit.Uwp.UI.Data.Utilities.ListCollectionView.ProcessCollectionChangedWithAdjustedIndex(NotifyCollectionChangedEventArgs args, Int32 adjustedOldIndex, Int32 adjustedNewIndex)
at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at TeachItUWP.Pages.LessonPlanningPage.AddEvent_Click(Object sender, RoutedEventArgs e) in C:\Users\pavel\source\repos\TeachItUWP\TeachItUWP\Pages\LessonPlanningPage.xaml.cs:line 270
如果我在切换事件中注释掉PlansGrid.ItemsSource = AllPlans;
,我不会收到错误消息,但是用户不会在网格上看到集合中的项目。
使用AllPlans.Add(newLessonPlan);
工作,但我试图使用PlansGrid.ScrollIntoView(newLessonPlan, null);
它给了我System.InvalidOperationException: 'Collection was modified; enumeration operation may not execute.'
之前描述的相同用户行为。
有人有这样的事情吗?
我创建了一个显示错误的示例项目:https ://1drv.ms/u/s!Avf9IdqZIPdXi2GAxF5meYl7oxIv?e=CnJe4N
经过进一步检查,这似乎是用户界面的问题,并且当您在网格中使用 RowDetailsTemplate 时。
在示例项目中,如果单击“Fill Long”按钮,它将更改集合,以便网格有足够的数据可以滚动,然后当您单击“Add a Row”按钮时会发生错误。
如果单击“填充短”按钮,因此只有 2 行,并且由于数据不足而无法滚动网格,则单击“添加行”时不会发生错误,但是如果单击它它会再次发生,因为网格现在有一个滚动条,因为它现在有更多数据。
如果您单击“填充短”按钮,然后调整窗口大小使其高度变小,则当您单击“添加行”按钮时,也会发生错误。
解决方案
此问题似乎是异常渲染,是由RowDetailsTemplate
.
作为一种解决方法,您可以这样写:
private void AddOne_Click(object sender, RoutedEventArgs e)
{
var randomGenerator = new Random();
var entitity1 = new TestEntity();
entitity1.Name = randomGenerator.Next(10, 999999).ToString();
entitity1.Description = "New Random";
TestGrid.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.Collapsed;
CollectionOfEntities.Insert(0,entitity1);
TestGrid.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.Visible;
}
在插入数据之前,先设置RowDetailsVisibilityMode
为Collapsed,然后再resume,这样就不会报错了。
你也可以在Github上报告这个问题。
推荐阅读
- javascript - 做出反应。函数不会从 API 首次运行中保存
- django - Twilio REST Exception HTTP 429 错误:无法创建记录:请求过多
- python - 在 Teletbon 中更改用户权限
- reverse-proxy - OpenIO swift拒绝主机头
- javascript - 错误:重新渲染过多。React 限制了渲染的数量以防止无限循环。反应
- vue.js - 选中 Vue 2.x 未点击复选框
- bpf - 将字符串发送回 BPF 代码并返回用户空间时是否存在字符串大小限制?
- python - 有没有办法在填充后保留图像的像素值?
- reactjs - 为什么我收到无效的挂钩调用错误?
- c# - c#构造函数通过反射获取'base'部分