SSPC-Tester/SSPCTester.UI/Views/SettingsView.xaml.cs
2026-06-30 12:10:29 +08:00

74 lines
2.5 KiB
C#

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<FrameworkElement>(element))
UpdateBindingSource(child);
}
}
private static IEnumerable<T> FindVisualChildren<T>(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<T>(child))
yield return descendant;
}
}
}