From 69d89ecd5671654f2401539d90070befb31d0804 Mon Sep 17 00:00:00 2001
From: Lorenz Stechauner <lorenz.stechauner@necronda.net>
Date: Fri, 21 Jul 2023 19:35:59 +0200
Subject: [PATCH] Fix event handlers in ControlUtils when new item is null

---
 Elwig/Helpers/ControlUtils.cs             | 37 +++++++++++------------
 Elwig/Windows/DeliveryAdminWindow.xaml.cs |  1 +
 Elwig/Windows/MemberAdminWindow.xaml.cs   |  1 +
 3 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/Elwig/Helpers/ControlUtils.cs b/Elwig/Helpers/ControlUtils.cs
index d8f11e1..d6da3e0 100644
--- a/Elwig/Helpers/ControlUtils.cs
+++ b/Elwig/Helpers/ControlUtils.cs
@@ -82,9 +82,7 @@ namespace Elwig.Helpers {
             if (selector.ItemsSource == source)
                 return;
             var selectedId = getId(selector.SelectedItem);
-            if (handler != null) selector.SelectionChanged -= handler;
-            selector.ItemsSource = source;
-            object? selItem = selector.SelectedItem;
+            object? selItem = null;
             if (selectedId != null && source != null)
                 selItem = source.Cast<object>().FirstOrDefault(i => selectedId.Equals(getId(i)));
             if (source != null && selItem == null) {
@@ -92,7 +90,9 @@ namespace Elwig.Helpers {
                     selItem = source.Cast<object>().First();
                 }
             }
-            if (handler != null) selector.SelectionChanged += handler;
+            if (handler != null && selItem != null) selector.SelectionChanged -= handler;
+            selector.ItemsSource = source;
+            if (handler != null && selItem != null) selector.SelectionChanged += handler;
             selector.SelectedItem = selItem;
         }
 
@@ -101,7 +101,6 @@ namespace Elwig.Helpers {
                 return;
             var selectedIds = selector.SelectedItems.Cast<object>().Select(i => getId(i)).ToList();
             selector.ItemsSource = source;
-            object? selItem = selector.SelectedItem;
             if (source != null) {
                 foreach (var i in source.Cast<object>().Where(i => selectedIds.Contains(getId(i))))
                     selector.SelectedItems.Add(i);
@@ -115,15 +114,7 @@ namespace Elwig.Helpers {
             var sortColumns = dataGrid.Columns.Select(c => c.SortDirection).ToList();
             var sort = dataGrid.Items.SortDescriptions.ToList();
             var selectedId = getId(dataGrid.SelectedItem);
-            if (handler != null) dataGrid.SelectionChanged -= handler;
-            dataGrid.ItemsSource = source;
-            object? selItem = dataGrid.SelectedItem;
-            if (keepSort) {
-                for (int i = 0; i < dataGrid.Columns.Count; i++)
-                    dataGrid.Columns[i].SortDirection = sortColumns[i];
-                foreach (var s in sort)
-                    dataGrid.Items.SortDescriptions.Add(s);
-            }
+            object? selItem = null;
             if (selectedId != null && source != null)
                 selItem = source.Cast<object>().FirstOrDefault(i => selectedId.Equals(getId(i)));
             if (source != null && selItem == null) {
@@ -131,8 +122,16 @@ namespace Elwig.Helpers {
                     selItem = source.Cast<object>().First();
                 }
             }
-            if (handler != null) dataGrid.SelectionChanged += handler;
+            if (handler != null && selItem != null) dataGrid.SelectionChanged -= handler;
+            dataGrid.ItemsSource = source;
+            if (handler != null && selItem != null) dataGrid.SelectionChanged += handler;
             dataGrid.SelectedItem = selItem;
+            if (keepSort) {
+                for (int i = 0; i < dataGrid.Columns.Count; i++)
+                    dataGrid.Columns[i].SortDirection = sortColumns[i];
+                foreach (var s in sort)
+                    dataGrid.Items.SortDescriptions.Add(s);
+            }
             if (dataGrid.SelectedItem != null && column != null)
                 dataGrid.CurrentCell = new(dataGrid.SelectedItem, column);
         }
@@ -141,9 +140,7 @@ namespace Elwig.Helpers {
             if (listBox.ItemsSource == source)
                 return;
             var selectedId = getId(listBox.SelectedItem);
-            if (handler != null) listBox.SelectionChanged -= handler;
-            listBox.ItemsSource = source;
-            object? selItem = listBox.SelectedItem;
+            object? selItem = null;
             if (selectedId != null && source != null)
                 selItem = source.Cast<object>().FirstOrDefault(i => selectedId.Equals(getId(i)));
             if (source != null && selItem == null) {
@@ -151,7 +148,9 @@ namespace Elwig.Helpers {
                     selItem = source.Cast<object>().First();
                 }
             }
-            if (handler != null) listBox.SelectionChanged += handler;
+            if (handler != null && selItem != null) listBox.SelectionChanged -= handler;
+            listBox.ItemsSource = source;
+            if (handler != null && selItem != null) listBox.SelectionChanged += handler;
             listBox.SelectedItem = selItem;
         }
 
diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs
index 2ef31a6..7e378bb 100644
--- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs
+++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs
@@ -178,6 +178,7 @@ namespace Elwig.Windows {
             } else {
                 ClearOriginalValues();
                 ClearInputs(validate);
+                ClearInputStates();
             }            
             GC.Collect();
         }
diff --git a/Elwig/Windows/MemberAdminWindow.xaml.cs b/Elwig/Windows/MemberAdminWindow.xaml.cs
index 07e40b2..90b68fe 100644
--- a/Elwig/Windows/MemberAdminWindow.xaml.cs
+++ b/Elwig/Windows/MemberAdminWindow.xaml.cs
@@ -107,6 +107,7 @@ namespace Elwig.Windows {
                 DeliveryButton.IsEnabled = false;
                 ClearOriginalValues();
                 ClearInputs(validate);
+                ClearInputStates();
             }
             GC.Collect();
         }