diff --git a/Elwig/Helpers/ControlUtils.cs b/Elwig/Helpers/ControlUtils.cs index 6773fe0..010b660 100644 --- a/Elwig/Helpers/ControlUtils.cs +++ b/Elwig/Helpers/ControlUtils.cs @@ -94,32 +94,28 @@ namespace Elwig.Helpers { var selectedId = getId(selector.SelectedItem); if (handler != null) selector.SelectionChanged -= handler; selector.ItemsSource = source; + object? selItem = selector.SelectedItem; if (selectedId != null && source != null) - selector.SelectedItem = source.Cast().FirstOrDefault(i => selectedId.Equals(getId(i))); - if (source != null && selector.SelectedItem == null) { + selItem = source.Cast().FirstOrDefault(i => selectedId.Equals(getId(i))); + if (source != null && selItem == null) { if ((def == RenewSourceDefault.IfOnly && source.Cast().Count() == 1) || def == RenewSourceDefault.First) { - selector.SelectedItem = source.Cast().First(); + selItem = source.Cast().First(); } } if (handler != null) selector.SelectionChanged += handler; + selector.SelectedItem = selItem; } - public static void RenewItemsSource(Xceed.Wpf.Toolkit.Primitives.Selector selector, IEnumerable? source, Func getId, Xceed.Wpf.Toolkit.Primitives.ItemSelectionChangedEventHandler? handler = null, RenewSourceDefault def = RenewSourceDefault.None) { + public static void RenewItemsSource(Xceed.Wpf.Toolkit.Primitives.Selector selector, IEnumerable? source, Func getId) { if (selector.ItemsSource == source) return; var selectedIds = selector.SelectedItems.Cast().Select(i => getId(i)).ToList(); - if (handler != null) selector.ItemSelectionChanged -= handler; selector.ItemsSource = source; + object? selItem = selector.SelectedItem; if (source != null) { foreach (var i in source.Cast().Where(i => selectedIds.Contains(getId(i)))) selector.SelectedItems.Add(i); } - if (source != null && selector.SelectedItem == null) { - if ((def == RenewSourceDefault.IfOnly && source.Cast().Count() == 1) || def == RenewSourceDefault.First) { - selector.SelectedItem = source.Cast().First(); - } - } - if (handler != null) selector.ItemSelectionChanged += handler; } public static void RenewItemsSource(DataGrid dataGrid, IEnumerable? source, Func getId, SelectionChangedEventHandler? handler = null, RenewSourceDefault def = RenewSourceDefault.None, bool keepSort = true) { @@ -131,6 +127,7 @@ namespace Elwig.Helpers { 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]; @@ -138,15 +135,16 @@ namespace Elwig.Helpers { dataGrid.Items.SortDescriptions.Add(s); } if (selectedId != null && source != null) - dataGrid.SelectedItem = source.Cast().FirstOrDefault(i => selectedId.Equals(getId(i))); - if (dataGrid.SelectedItem != null && column != null) - dataGrid.CurrentCell = new(dataGrid.SelectedItem, column); - if (source != null && dataGrid.SelectedItem == null) { + selItem = source.Cast().FirstOrDefault(i => selectedId.Equals(getId(i))); + if (source != null && selItem == null) { if ((def == RenewSourceDefault.IfOnly && source.Cast().Count() == 1) || def == RenewSourceDefault.First) { - dataGrid.SelectedItem = source.Cast().First(); + selItem = source.Cast().First(); } } if (handler != null) dataGrid.SelectionChanged += handler; + dataGrid.SelectedItem = selItem; + if (dataGrid.SelectedItem != null && column != null) + dataGrid.CurrentCell = new(dataGrid.SelectedItem, column); } public static void RenewItemsSource(ListBox listBox, IEnumerable? source, Func getId, SelectionChangedEventHandler? handler = null, RenewSourceDefault def = RenewSourceDefault.None) { @@ -155,14 +153,16 @@ namespace Elwig.Helpers { var selectedId = getId(listBox.SelectedItem); if (handler != null) listBox.SelectionChanged -= handler; listBox.ItemsSource = source; + object? selItem = listBox.SelectedItem; if (selectedId != null && source != null) - listBox.SelectedItem = source.Cast().FirstOrDefault(i => selectedId.Equals(getId(i))); - if (source != null && listBox.SelectedItem == null) { + selItem = source.Cast().FirstOrDefault(i => selectedId.Equals(getId(i))); + if (source != null && selItem == null) { if ((def == RenewSourceDefault.IfOnly && source.Cast().Count() == 1) || def == RenewSourceDefault.First) { - listBox.SelectedItem = source.Cast().First(); + selItem = source.Cast().First(); } } if (handler != null) listBox.SelectionChanged += handler; + listBox.SelectedItem = selItem; } public static object? GetItemFromSource(IEnumerable source, Func getId, object? id) {