ControlUtils: Cleanup SelectItem() method and use accordingly

This commit is contained in:
2024-03-18 17:55:27 +01:00
parent 51e345f1fd
commit 2f3524db9d
20 changed files with 181 additions and 194 deletions

View File

@ -84,13 +84,13 @@ namespace Elwig.Helpers {
return null;
}
public static void RenewItemsSource(Selector selector, IEnumerable? source, Func<object?, object?> getId, SelectionChangedEventHandler? handler = null, RenewSourceDefault def = RenewSourceDefault.None) {
public static void RenewItemsSource(Selector selector, IEnumerable? source, SelectionChangedEventHandler? handler = null, RenewSourceDefault def = RenewSourceDefault.None) {
if (selector.ItemsSource == source)
return;
var selectedId = getId(selector.SelectedItem);
var selectedId = Utils.GetEntityIdentifier(selector.SelectedItem);
object? selItem = null;
if (selectedId != null && source != null)
selItem = source.Cast<object>().FirstOrDefault(i => selectedId.Equals(getId(i)));
if (selectedId != 0 && source != null)
selItem = source.Cast<object>().FirstOrDefault(i => selectedId.Equals(Utils.GetEntityIdentifier(i)));
if (source != null && selItem == null) {
if ((def == RenewSourceDefault.IfOnly && source.Cast<object>().Count() == 1) || def == RenewSourceDefault.First) {
selItem = source.Cast<object>().First();
@ -102,30 +102,30 @@ namespace Elwig.Helpers {
selector.SelectedItem = selItem;
}
public static void RenewItemsSource(Xceed.Wpf.Toolkit.Primitives.Selector selector, IEnumerable? source, Func<object?, object?> getId, Xceed.Wpf.Toolkit.Primitives.ItemSelectionChangedEventHandler? handler = null) {
public static void RenewItemsSource(Xceed.Wpf.Toolkit.Primitives.Selector selector, IEnumerable? source, Xceed.Wpf.Toolkit.Primitives.ItemSelectionChangedEventHandler? handler = null) {
if (selector.ItemsSource == source)
return;
var selectedIds = selector.SelectedItems.Cast<object>().Select(i => getId(i)).ToList();
var selectedIds = selector.SelectedItems.Cast<object>().Select(i => Utils.GetEntityIdentifier(i)).ToList();
if (handler != null && selectedIds != null) selector.ItemSelectionChanged -= handler;
selector.ItemsSource = source;
if (source != null) {
selector.SelectedItems.Clear();
foreach (var i in source.Cast<object>().Where(i => selectedIds.Contains(getId(i))))
foreach (var i in source.Cast<object>().Where(i => selectedIds.Contains(Utils.GetEntityIdentifier(i))))
selector.SelectedItems.Add(i);
}
if (handler != null && selectedIds != null) selector.ItemSelectionChanged += handler;
}
public static void RenewItemsSource(DataGrid dataGrid, IEnumerable? source, Func<object?, object?> getId, SelectionChangedEventHandler? handler = null, RenewSourceDefault def = RenewSourceDefault.None, bool keepSort = true) {
public static void RenewItemsSource(DataGrid dataGrid, IEnumerable? source, SelectionChangedEventHandler? handler = null, RenewSourceDefault def = RenewSourceDefault.None, bool keepSort = true) {
if (dataGrid.ItemsSource == source)
return;
var column = dataGrid.CurrentCell.Column;
var sortColumns = dataGrid.Columns.Select(c => c.SortDirection).ToList();
var sort = dataGrid.Items.SortDescriptions.ToList();
var selectedId = getId(dataGrid.SelectedItem);
var selectedId = Utils.GetEntityIdentifier(dataGrid.SelectedItem);
object? selItem = null;
if (selectedId != null && source != null)
selItem = source.Cast<object>().FirstOrDefault(i => selectedId.Equals(getId(i)));
if (selectedId != 0 && source != null)
selItem = source.Cast<object>().FirstOrDefault(i => selectedId.Equals(Utils.GetEntityIdentifier(i)));
if (source != null && selItem == null) {
if ((def == RenewSourceDefault.IfOnly && source.Cast<object>().Count() == 1) || def == RenewSourceDefault.First) {
selItem = source.Cast<object>().First();
@ -145,13 +145,13 @@ namespace Elwig.Helpers {
dataGrid.CurrentCell = new(dataGrid.SelectedItem, column);
}
public static void RenewItemsSource(ListBox listBox, IEnumerable? source, Func<object?, object?> getId, SelectionChangedEventHandler? handler = null, RenewSourceDefault def = RenewSourceDefault.None) {
public static void RenewItemsSource(ListBox listBox, IEnumerable? source, SelectionChangedEventHandler? handler = null, RenewSourceDefault def = RenewSourceDefault.None) {
if (listBox.ItemsSource == source)
return;
var selectedId = getId(listBox.SelectedItem);
var selectedId = Utils.GetEntityIdentifier(listBox.SelectedItem);
object? selItem = null;
if (selectedId != null && source != null)
selItem = source.Cast<object>().FirstOrDefault(i => selectedId.Equals(getId(i)));
if (selectedId != 0 && source != null)
selItem = source.Cast<object>().FirstOrDefault(i => selectedId.Equals(Utils.GetEntityIdentifier(i)));
if (source != null && selItem == null) {
if ((def == RenewSourceDefault.IfOnly && source.Cast<object>().Count() == 1) || def == RenewSourceDefault.First) {
selItem = source.Cast<object>().FirstOrDefault();
@ -163,61 +163,65 @@ namespace Elwig.Helpers {
listBox.SelectedItem = selItem;
}
public static object? GetItemFromSource(IEnumerable source, Func<object?, object?> getId, object? id) {
public static object? GetItemFromSource(IEnumerable source, int? hash) {
if (source == null)
return null;
var items = source.Cast<object>();
var item = items.Where(i => getId(i)?.Equals(id) ?? false).FirstOrDefault();
var item = items.Where(i => Utils.GetEntityIdentifier(i) == hash).FirstOrDefault();
if (item == null && items.Any(i => i is NullItem))
return items.Where(i => i is NullItem).First();
return item;
}
public static object? GetItemFromSource(IEnumerable source, object? item, Func<object?, object?> getId) {
return GetItemFromSource(source, getId, getId(item));
public static object? GetItemFromSource(IEnumerable source, object? item) {
return GetItemFromSource(source, Utils.GetEntityIdentifier(item));
}
public static void SelectComboBoxItem(ComboBox cb, Func<object?, object?> getId, object? id) {
cb.SelectedItem = GetItemFromSource(cb.ItemsSource, getId, id);
public static void SelectItemWithHash(Selector input, int? hash) {
if (hash == null) {
input.SelectedItem = null;
} else {
input.SelectedItem = GetItemFromSource(input.ItemsSource, (int)hash);
}
if (input is ListBox lb) {
lb.ScrollIntoView(lb.SelectedItem);
} else if (input is DataGrid dg) {
dg.ScrollIntoView(dg.SelectedItem);
}
}
public static void SelectComboBoxItem(ComboBox cb, object? item, Func<object?, object?> getId) {
SelectComboBoxItem(cb, getId, getId(item));
public static void SelectItemWithPk(Selector input, params object?[] pk) {
SelectItemWithHash(input, Utils.GetEntityIdentifier(pk));
}
public static void SelectListBoxItem(ListBox lb, Func<object?, object?> getId, object? id) {
lb.SelectedItem = GetItemFromSource(lb.ItemsSource, getId, id);
lb.ScrollIntoView(lb.SelectedItem);
public static void SelectItem(Selector input, object? item) {
SelectItemWithHash(input, Utils.GetEntityIdentifier(item));
}
public static void SelectListBoxItem(ListBox lb, object? item, Func<object?, object?> getId) {
SelectListBoxItem(lb, getId, getId(item));
}
public static IEnumerable<object?> GetItemsFromSource(IEnumerable source, Func<object?, object?> getId, IEnumerable<object?> ids) {
public static IEnumerable<object?> GetItemsFromSource(IEnumerable source, IEnumerable<int?> ids) {
if (source == null)
return Array.Empty<object>();
return source.Cast<object>().Where(i => ids.Any(c => c?.Equals(getId(i)) ?? false));
return [];
return source.Cast<object>().Where(i => ids.Any(c => c == Utils.GetEntityIdentifier(i)));
}
public static IEnumerable<object?> GetItemsFromSource(IEnumerable source, IEnumerable<object?>? items, Func<object?, object?> getId) {
public static IEnumerable<object?> GetItemsFromSource(IEnumerable source, IEnumerable<object?>? items) {
if (items == null)
return Array.Empty<object>();
return GetItemsFromSource(source, getId, items.Select(i => getId(i)));
return [];
return GetItemsFromSource(source, items.Select(Utils.GetEntityIdentifier));
}
public static void SelectCheckComboBoxItems(Xceed.Wpf.Toolkit.CheckComboBox ccb, Func<object?, object?> getId, IEnumerable<object?>? ids) {
public static void SelectItems(Xceed.Wpf.Toolkit.CheckComboBox ccb, IEnumerable<int?>? ids) {
ccb.SelectedItems.Clear();
if (ids == null) return;
foreach (var id in ids)
ccb.SelectedItems.Add(GetItemFromSource(ccb.ItemsSource, getId, id));
ccb.SelectedItems.Add(GetItemFromSource(ccb.ItemsSource, id));
}
public static void SelectCheckComboBoxItems(Xceed.Wpf.Toolkit.CheckComboBox ccb, IEnumerable<object>? items, Func<object?, object?> getId) {
SelectCheckComboBoxItems(ccb, getId, items?.Select(i => getId(i)));
public static void SelectItems(Xceed.Wpf.Toolkit.CheckComboBox ccb, IEnumerable<object>? items) {
SelectItems(ccb, items?.Select(Utils.GetEntityIdentifier));
}
public static int GetInputHashCode(Control input) {
public static int? GetInputHashCode(Control input) {
if (input is TextBox tb) {
return Utils.GetEntityIdentifier(tb.Text);
} else if (input is ComboBox sb) {
@ -229,7 +233,7 @@ namespace Elwig.Helpers {
} else if (input is RadioButton rb) {
return Utils.GetEntityIdentifier(rb.IsChecked);
} else {
return 0;
return null;
}
}
}