Index: Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs =================================================================== diff -u -rae5c573fb82f4b30350f63cb6f202ae99275f4ff -r8e791325754da4938269fdc3af7ef3c71fbcd402 --- Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision ae5c573fb82f4b30350f63cb6f202ae99275f4ff) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision 8e791325754da4938269fdc3af7ef3c71fbcd402) @@ -147,6 +147,10 @@ if (data == null) { + // Propagate a selection change here manually as setting the treeview selection to null (by clearing all nodes) + // does not fire the AfterSelect event + OnSelectedDataChanged(); + return; } @@ -669,7 +673,7 @@ return treeNode.Parent != null ? treeNode.Parent.Tag : null; } - private Image CreateCheckBoxGlyph(CheckBoxState state) + private static Image CreateCheckBoxGlyph(CheckBoxState state) { var result = new Bitmap(16, 16); @@ -704,7 +708,7 @@ } } - private string GetImageHash(Image image) + private static string GetImageHash(Image image) { var stream = new MemoryStream(); image.Save(stream, image.RawFormat); @@ -951,6 +955,11 @@ private void TreeViewAfterSelect(object sender, TreeViewEventArgs e) { + OnSelectedDataChanged(); + } + + private void OnSelectedDataChanged() + { if (SelectedDataChanged != null) { SelectedDataChanged(this, EventArgs.Empty); Index: Core/Common/test/Core.Common.Controls.TreeView.Test/TreeViewControlTest.cs =================================================================== diff -u -r7ae9100ff4e61169edcefaeb01b72d492431742f -r8e791325754da4938269fdc3af7ef3c71fbcd402 --- Core/Common/test/Core.Common.Controls.TreeView.Test/TreeViewControlTest.cs (.../TreeViewControlTest.cs) (revision 7ae9100ff4e61169edcefaeb01b72d492431742f) +++ Core/Common/test/Core.Common.Controls.TreeView.Test/TreeViewControlTest.cs (.../TreeViewControlTest.cs) (revision 8e791325754da4938269fdc3af7ef3c71fbcd402) @@ -1292,7 +1292,7 @@ [Test] [RequiresSTA] - public void SelectedDataChanged_ListenerSetOnInit_SelectedDataChangedInvokedOnce() + public void SelectedDataChanged_ListenerSetOnInitAndDataSetToNull_SelectedDataChangedInvokedOnce() { // Setup using (var treeViewControl = new TreeViewControl()) @@ -1315,6 +1315,49 @@ }; treeViewControl.RegisterTreeNodeInfo(treeNodeInfo); treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo); + + try + { + WindowsFormsTestHelper.Show(treeViewControl); + + // Call + treeViewControl.Data = null; + + // Assert + Assert.AreEqual(1, hit); + } + finally + { + WindowsFormsTestHelper.CloseAll(); + } + } + } + + [Test] + [RequiresSTA] + public void SelectedDataChanged_ListenerSetOnInitAndDataSetToObject_SelectedDataChangedInvokedOnce() + { + // Setup + using (var treeViewControl = new TreeViewControl()) + { + var hit = 0; + treeViewControl.SelectedDataChanged += (sender, args) => hit++; + var treeNodeInfo = new TreeNodeInfo + { + TagType = typeof(object), + ChildNodeObjects = o => new object[] + { + string.Empty + }, + Text = o => "root" + }; + var childTreeNodeInfo = new TreeNodeInfo + { + TagType = typeof(string), + Text = o => "child" + }; + treeViewControl.RegisterTreeNodeInfo(treeNodeInfo); + treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo); var data = new object(); try