From 626aa9cd19008366e223babe9d63e59664c07923 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 9 Dec 2015 20:09:26 +0100 Subject: [PATCH] Fix SelectingItemsControl.SelectedItems bug. Make sure unbound SelectedItems cleared when DataContext is cleared. --- src/Perspex.Controls/Control.cs | 5 ++++ .../SelectingItemsControlTests_Multiple.cs | 28 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/Perspex.Controls/Control.cs b/src/Perspex.Controls/Control.cs index 861192202b..25cabadb0a 100644 --- a/src/Perspex.Controls/Control.cs +++ b/src/Perspex.Controls/Control.cs @@ -419,6 +419,11 @@ namespace Perspex.Controls if (control != null) { control.IsDataContextChanging = notifying; + + if (!notifying) + { + control.OnDataContextFinishedChanging(); + } } } } diff --git a/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs b/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs index d651216ca3..3d19e353ad 100644 --- a/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs +++ b/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs @@ -427,6 +427,34 @@ namespace Perspex.Controls.UnitTests.Primitives // Clear DataContext and ensure that SelectedItems is still set in the VM. target.DataContext = null; Assert.Equal(new[] { "bar" }, vm.SelectedItems); + + // Ensure target's SelectedItems is now clear. + Assert.Empty(target.SelectedItems); + } + + [Fact] + public void Unbound_SelectedItems_Should_Be_Cleared_When_DataContext_Cleared() + { + var data = new + { + Items = new[] { "foo", "bar", "baz" }, + }; + + var target = new TestSelector + { + DataContext = data, + Template = Template(), + }; + + var itemsBinding = new Binding { Path = "Items" }; + itemsBinding.Bind(target, TestSelector.ItemsProperty); + + Assert.Same(data.Items, target.Items); + + target.SelectedItems.Add("bar"); + target.DataContext = null; + + Assert.Empty(target.SelectedItems); } private FuncControlTemplate Template()