using System.Collections.Specialized; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using YY.Admin.ViewModels.RubberQuickTest; namespace YY.Admin.Views.RubberQuickTest; public partial class RubberQuickTestOperationView : UserControl { private RubberQuickTestOperationViewModel? _vm; public RubberQuickTestOperationView() { InitializeComponent(); Loaded += OnLoaded; DataContextChanged += OnDataContextChanged; Unloaded += (_, _) => DetachViewModel(); } private void OnLoaded(object sender, RoutedEventArgs e) { // 兜底:AutoWireViewModel 可能在构造函数订阅 DataContextChanged 之前就设置了 DataContext AttachViewModel(DataContext as RubberQuickTestOperationViewModel); } private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { DetachViewModel(); AttachViewModel(DataContext as RubberQuickTestOperationViewModel); } private void AttachViewModel(RubberQuickTestOperationViewModel? vm) { if (vm == null || ReferenceEquals(_vm, vm)) return; _vm = vm; _vm.InspectColumnsChanged += RebuildInspectColumns; _vm.DataPointColumns.CollectionChanged += OnDataPointColumnsChanged; RebuildInspectColumns(); } private void DetachViewModel() { if (_vm == null) return; _vm.InspectColumnsChanged -= RebuildInspectColumns; _vm.DataPointColumns.CollectionChanged -= OnDataPointColumnsChanged; _vm = null; } private void OnDataPointColumnsChanged(object? sender, NotifyCollectionChangedEventArgs e) => RebuildInspectColumns(); private void RebuildInspectColumns() { if (!Dispatcher.CheckAccess()) { Dispatcher.Invoke(RebuildInspectColumns); return; } var vm = _vm ?? DataContext as RubberQuickTestOperationViewModel; if (vm == null) return; InspectResultGrid.Columns.Clear(); InspectResultGrid.Columns.Add(new DataGridTextColumn { Header = "编号", Binding = new Binding(nameof(QuickTestInspectRowViewModel.RowNo)) { Mode = BindingMode.OneWay }, IsReadOnly = true, Width = 80 }); for (int i = 0; i < vm.DataPointColumns.Count; i++) { var col = vm.DataPointColumns[i]; var columnIndex = i; var header = string.IsNullOrWhiteSpace(col.PointName) ? $"数据点{columnIndex + 1}" : col.PointName; InspectResultGrid.Columns.Add(new DataGridTextColumn { Header = header, Binding = new Binding($"Cells[{columnIndex}].Value") { UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged, Mode = BindingMode.TwoWay, TargetNullValue = string.Empty }, Width = 100, IsReadOnly = false }); } InspectResultGrid.Columns.Add(new DataGridTextColumn { Header = "实验结果", Binding = new Binding(nameof(QuickTestInspectRowViewModel.InspectResultText)) { Mode = BindingMode.OneWay }, IsReadOnly = true, Width = 90 }); } private void InspectResultGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { var vm = _vm ?? DataContext as RubberQuickTestOperationViewModel; if (vm == null) return; vm.SelectedInspectRow = InspectResultGrid.SelectedItem as QuickTestInspectRowViewModel; } }