diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs index 0b29932877..95113e350e 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs @@ -93,10 +93,8 @@ namespace ICSharpCode.PackageManagement public void ReadPackages() { allPackages = null; - pages.CollectionChanged -= PagesChanged; SelectedPageNumber = 1; UpdatePackageViewModels(); - pages.CollectionChanged += PagesChanged; } void PagesChanged(object sender, NotifyCollectionChangedEventArgs e) @@ -107,9 +105,13 @@ namespace ICSharpCode.PackageManagement void UpdatePackageViewModels() { + pages.CollectionChanged -= PagesChanged; + IEnumerable packages = GetPackagesForSelectedPage(); pages.TotalItemsOnSelectedPage = packages.Count(); UpdatePackageViewModels(packages); + + pages.CollectionChanged += PagesChanged; } IEnumerable GetPackagesForSelectedPage() diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs index d96914bf40..25dbf2940f 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs @@ -93,6 +93,52 @@ namespace PackageManagement.Tests viewModel.Search(); Assert.AreEqual(0, viewModel.PackageViewModels.Count); - } + } + + [Test] + public void ShowNextPage_TwoObjectsWatchingForPagesCollectionChangedEventAndUserMovesToPageTwoAndFilteredPackagesReturnsLessThanExpectedPackagesDueToMatchingVersions_InvalidOperationExceptionNotThrownWhen() + { + CreateViewModel(); + viewModel.PageSize = 2; + + var package1 = new FakePackage() { + Id = "First", + Description = "", + Version = new Version(0, 1, 0, 0) + }; + var package2 = new FakePackage() { + Id = "Secon", + Description = "", + Version = new Version(0, 2, 0, 0) + }; + var package3 = new FakePackage() { + Id = "Test", + Description = "", + Version = new Version(0, 3, 0, 0) + }; + var package4 = new FakePackage() { + Id = "Test", + Description = "", + Version = new Version(0, 4, 0, 0) + }; + var packages = new FakePackage[] { + package1, package2, package3, package4 + }; + + packageManagementService.FakeActivePackageRepository.FakePackages.AddRange(packages); + + viewModel.ReadPackages(); + + bool collectionChangedEventFired = false; + viewModel.Pages.CollectionChanged += (sender, e) => collectionChangedEventFired = true; + viewModel.ShowNextPage(); + + var expectedPackages = new FakePackage[] { + package4 + }; + + PackageCollectionAssert.AreEqual(expectedPackages, viewModel.PackageViewModels); + Assert.IsTrue(collectionChangedEventFired); + } } }