diff --git a/Microsoft.Toolkit.Uwp.UI/AdvancedCollectionView/AdvancedCollectionView.cs b/Microsoft.Toolkit.Uwp.UI/AdvancedCollectionView/AdvancedCollectionView.cs index 278ef50d1fe..e2e37a214f9 100644 --- a/Microsoft.Toolkit.Uwp.UI/AdvancedCollectionView/AdvancedCollectionView.cs +++ b/Microsoft.Toolkit.Uwp.UI/AdvancedCollectionView/AdvancedCollectionView.cs @@ -677,33 +677,17 @@ private bool HandleItemAdded(int newStartingIndex, object newItem, int? viewInde return false; } - if (newStartingIndex == 0 || _view.Count == 0) - { - newViewIndex = 0; - } - else if (newStartingIndex == _source.Count - 1) - { - newViewIndex = _view.Count - 1; - } - else if (viewIndex.HasValue) + if (viewIndex.HasValue) { newViewIndex = viewIndex.Value; } else { - for (int i = 0, j = 0; i < _source.Count; i++) - { - if (i == newStartingIndex) - { - newViewIndex = j; - break; - } - - if (_view[j] == _source[i]) - { - j++; - } - } + newViewIndex = _view.Select(x => _source.IndexOf(x)) // Get indexes of all items that are currently in view + .Concat(new int[] { newStartingIndex }) // Add index of item that need to be inserted in view + .OrderBy(x => x) + .ToList() + .IndexOf(newStartingIndex); // Get the index for new item in view } } diff --git a/UnitTests/UnitTests.UWP/UI/Test_AdvancedCollectionView.cs b/UnitTests/UnitTests.UWP/UI/Test_AdvancedCollectionView.cs index 9a5f59fe457..fad213a82c7 100644 --- a/UnitTests/UnitTests.UWP/UI/Test_AdvancedCollectionView.cs +++ b/UnitTests/UnitTests.UWP/UI/Test_AdvancedCollectionView.cs @@ -1053,6 +1053,55 @@ public void Test_AdvancedCollectionView_Sorting_CustomComparable_With_Shaping() Assert.AreEqual(42, ((Person)a.First()).Age); } + [TestCategory("AdvancedCollectionView")] + [UITestMethod] + public void Test_AdvancedCollectionView_Filterd_Using_Shaping_Changing_Properties() + { + var l = new ObservableCollection + { + new Person() + { + Name = "lorem", + Age = 4 + }, + new Person() + { + Name = "imsum", + Age = 8 + }, + new Person() + { + Name = "dolor", + Age = 15 + }, + new Person() + { + Name = "sit", + Age = 16 + }, + new Person() + { + Name = "amet", + Age = 23 + }, + new Person() + { + Name = "consectetur", + Age = 42 + }, + }; + + var a = new AdvancedCollectionView(l, true); + a.ObserveFilterProperty(nameof(Person.Age)); + a.Filter = p => ((Person)p).Age <= 5; + + Assert.AreEqual(1, a.Count); + + l[4].Age = 5; + + Assert.AreEqual(2, a.Count); + } + private class DelegateComparable : IComparer { private Func _func;