using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using SSPCTester.UI.ViewModels; namespace SSPCTester.UI.Views; public partial class SettingsView : UserControl { public SettingsView() { InitializeComponent(); } private async void SettingChanged(object sender, RoutedEventArgs e) { UpdateBindingSource(sender); if (DataContext is ViewModels.SettingsViewModel vm) { vm.NotifyDaqSettingsChanged(); try { await vm.SaveSettingsAsync(); } catch { vm.ScheduleSave(); } } } private void DaqRoleChanged(object sender, SelectionChangedEventArgs e) { if (sender is ComboBox { DataContext: DaqChannelEditor editor, SelectedItem: string role } && editor.Role != role) { editor.Role = role; } SettingChanged(sender, e); } private void DaqCalibrationChanged(object sender, RoutedEventArgs e) { if (sender is CheckBox { DataContext: DaqChannelEditor editor } checkBox) editor.IsCalibrated = checkBox.IsChecked == true; SettingChanged(sender, e); } private static void UpdateBindingSource(object sender) { if (sender is ComboBox comboBox) { comboBox.GetBindingExpression(Selector.SelectedValueProperty)?.UpdateSource(); comboBox.GetBindingExpression(Selector.SelectedItemProperty)?.UpdateSource(); comboBox.GetBindingExpression(ComboBox.TextProperty)?.UpdateSource(); } else if (sender is TextBox textBox) { textBox.GetBindingExpression(TextBox.TextProperty)?.UpdateSource(); } else if (sender is ToggleButton toggleButton) { toggleButton.GetBindingExpression(ToggleButton.IsCheckedProperty)?.UpdateSource(); } else if (sender is FrameworkElement element) { foreach (var child in FindVisualChildren(element)) UpdateBindingSource(child); } } private static IEnumerable FindVisualChildren(DependencyObject parent) where T : DependencyObject { for (int i = 0; i < System.Windows.Media.VisualTreeHelper.GetChildrenCount(parent); i++) { var child = System.Windows.Media.VisualTreeHelper.GetChild(parent, i); if (child is T typed) yield return typed; foreach (var descendant in FindVisualChildren(child)) yield return descendant; } } }