首页 > 解决方案 > 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 行,并且由于数据不足而无法滚动网格,则单击“添加行”时不会发生错误,但是如果单击它它会再次发生,因为网格现在有一个滚动条,因为它现在有更多数据。

如果您单击“填充短”按钮,然后调整窗口大小使其高度变小,则当您单击“添加行”按钮时,也会发生错误。

标签: uwp

解决方案


此问题似乎是异常渲染,是由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上报告这个问题。


推荐阅读