--- source_files: - DataPRO/Modules/Reports/PedestrianAndHeadReports/ViewModel/HeadReportViewModel.cs - DataPRO/Modules/Reports/PedestrianAndHeadReports/ViewModel/TRLReportViewModel.cs generated_at: "2026-04-16T04:55:26.671118+00:00" model: "Qwen/Qwen3-Coder-Next-FP8" schema_version: 1 sha256: "3e435356eaf751fb" --- # Documentation: HeadReportViewModel and TRLReportViewModel ## 1. Purpose These two view models (`HeadReportViewModel` and `TRLReportViewModel`) serve as shared data contexts for input and output views in the Pedestrian and Head Reports module of the DataPRO application. They implement Prism-based MVVM patterns to manage UI state (e.g., busy indicators, dirty state, inclusion flags for menu/navigation), handle notification/confirmation interactions via `InteractionRequest`, and expose properties for report configuration (e.g., time/acceleration units, channel selections). `HeadReportViewModel` is a simpler implementation focused on generic report UI state, while `TRLReportViewModel` extends this with domain-specific properties and initialization logic tied to a `DTS.Serialization.Test` object, including channel population and unit filtering. Both are exported as views (`IHeadReportInputView`/`IHeadReportOutputView` and `ITRLReportInputView`/`ITRLReportOutputView`) and are intended to coordinate data flow between UI and backend (though current functionality is limited to XML string exchange per comments). --- ## 2. Public Interface ### `HeadReportViewModel` - **`HeadReportViewModel(IHeadReportInputView inputView, IHeadReportOutputView outputView, IRegionManager regionManager, IEventAggregator eventAggregator, IUnityContainer unityContainer)`** Constructor. Assigns views, sets up `DataContext`, initializes `InteractionRequest`s, and subscribes to `RaiseNotification` and `BusyIndicatorChangeNotification` events. - **`IHeadReportInputView InputView { get; set; }`** Reference to the input view instance. - **`IHeadReportOutputView OutputView { get; set; }`** Reference to the output view instance. - **`InteractionRequest NotificationRequest { get; }`** Prism interaction request used to trigger notification popups (e.g., alerts). - **`InteractionRequest ConfirmationRequest { get; }`** Prism interaction request used to trigger confirmation dialogs. - **`bool IsDirty { get; }`** Read-only property indicating whether the model has unsaved changes. *Currently never set to `true` in source.* - **`bool IsBusy { get; set; }`** Bindable property indicating whether the UI is busy. Set via `OnBusyIndicatorNotification(bool)` event handler. - **`bool IsMenuIncluded { get; set; }`** Bindable property indicating whether the report should include the menu. Defaults to `false`. - **`bool IsNavigationIncluded { get; set; }`** Bindable property indicating whether the report should include navigation. Defaults to `false`. - **`string HeaderInfo { get; }`** Returns the literal string `"MainRegion"`. - **`void OnPropertyChanged(string propertyName)`** Raises the `PropertyChanged` event for the specified property. - **`event PropertyChangedEventHandler PropertyChanged`** Standard `INotifyPropertyChanged` event. - **Lifecycle methods (no-op):** `Cleanup()`, `CleanupAsync()`, `Initialize()`, `Initialize(object)`, `Initialize(object, object)`, `InitializeAsync()`, `InitializeAsync(object)`, `Activated()` All are empty stubs; no behavior implemented. - **`OnRaiseNotification(NotificationContentEventArgs)`** *(private)* Event handler that reformats `NotificationContentEventArgs` and raises `NotificationRequest`. - **`OnBusyIndicatorNotification(bool)`** *(private)* Event handler that sets `IsBusy` to the incoming boolean. --- ### `TRLReportViewModel` - **`TRLReportViewModel(ITRLReportInputView inputView, ITRLReportOutputView outputView, IRegionManager regionManager, IEventAggregator eventAggregator, IUnityContainer unityContainer, DTS.Serialization.Test test)`** Constructor. Initializes `Test`, `AvailableTimeUnits`, `SelectedTimeUnits`, `AvailableAccelerationUnits`, and `SelectedAccelerationUnit`. Calls `PopulateChannels()` to populate channel arrays. Assigns views, sets up `DataContext`, initializes `InteractionRequest`s, and subscribes to events. - **`ITRLReportInputView InputView { get; set; }`** Reference to the input view instance. - **`ITRLReportOutputView OutputView { get; set; }`** Reference to the output view instance. - **`InteractionRequest NotificationRequest { get; }`** Prism interaction request for notifications. - **`InteractionRequest ConfirmationRequest { get; }`** Prism interaction request for confirmations. - **`DTS.Serialization.Test Test { get; set; }`** The test object used to populate channels and metadata. - **`bool IsDirty { get; }`** Read-only property indicating unsaved changes. *Currently never set to `true`.* - **`bool IsBusy { get; set; }`** Bindable busy state. Set via `OnBusyIndicatorNotification(bool)`. - **`bool IsMenuIncluded { get; set; }`** Bindable flag for menu inclusion. Defaults to `false`. - **`bool IsNavigationIncluded { get; set; }`** Bindable flag for navigation inclusion. Defaults to `false`. - **`string HeaderInfo { get; }`** Returns `"MainRegion"`. - **`string TestNumber { get; set; }`** Bindable string for test number. - **`string DateTimeText { get; set; }`** Bindable string representation of `_dateTime`. Getter uses `CultureInfo.CurrentCulture`; setter parses via `DateTime.Parse`. - **`string CarName { get; set; }`** Bindable string for car name. - **`string Model { get; set; }`** Bindable string for model. - **`string TestTemperature { get; set; }`** Bindable string for test temperature. - **`string MeasurementPoint { get; set; }`** Bindable string for measurement point. - **`string CrashVelocity { get; set; }`** Bindable string for crash velocity. - **`string ImpactorID { get; set; }`** Bindable string for impactor ID. - **`string[] AvailableImpactorTypes => throw new NotImplementedException();`** *Unimplemented*; throws `NotImplementedException`. - **`string SelectedImpactor { get; set; }`** Bindable string for selected impactor. - **`string ImpactorWeight { get; set; }`** Bindable string for impactor weight. - **`string Examiner { get; set; }`** Bindable string for examiner name. - **`string Reserved1 { get; set; }`** Bindable string for reserved field 1. - **`string Reserved2 { get; set; }`** Bindable string for reserved field 2. - **`DTS.SensorDB.FilterClass[] AvailableCFCs => throw new NotImplementedException();`** *Unimplemented*; throws `NotImplementedException`. - **`DTS.SensorDB.FilterClass SelectedCFC { get; set; }`** Bindable filter class. - **`DTS.SensorDB.MeasurementUnit[] AvailableAccelerationUnits { get; set; }`** Array of available acceleration units (initialized to `"m/sec^2"` and `"g"`). - **`DTS.SensorDB.MeasurementUnit SelectedAccelerationUnit { get; set; }`** Selected acceleration unit. Defaults to first in `AvailableAccelerationUnits`. - **`ConstantsAndEnums.TimeUnits[] AvailableTimeUnits { get; set; }`** Array of available time units (`Seconds`, `MilliSeconds`). - **`ConstantsAndEnums.TimeUnits SelectedTimeUnits { get; set; }`** Selected time unit. Defaults to `Seconds`. - **`Event.Module.AnalogInputChannel[] AccelerationChannels { get; set; }`** Array of acceleration channels (populated in `PopulateChannels()`). - **`Event.Module.Channel SelectedAccelerationChannel { get; set; }`** Selected acceleration channel. - **`Event.Module.AnalogInputChannel[] AvailableBendingChannels { get; set; }`** Array of bending channels (populated in `PopulateChannels()`). - **`Event.Module.Channel SelectedBendingChannel { get; set; }`** Selected bending channel. - **`Event.Module.AnalogInputChannel[] AvailableShearChannels { get; set; }`** Array of shear channels (populated in `PopulateChannels()`). - **`Event.Module.Channel SelectedShearChannel { get; set; }`** Selected shear channel. - **`void PopulateChannels()`** *(private)* Filters `Test.Channels` into acceleration, bending, and shear channel arrays based on engineering units. Uses `DTS.SensorDB.MeasurementUnitList.GetMeasurementUnit()` for unit lookups. - **`void OnPropertyChanged(string propertyName)`** Raises `PropertyChanged` event. - **`event PropertyChangedEventHandler PropertyChanged`** Standard `INotifyPropertyChanged` event. - **Lifecycle methods (no-op):** Same as `HeadReportViewModel`: `Cleanup()`, `CleanupAsync()`, `Initialize()`, `Initialize(object)`, `Initialize(object, object)`, `InitializeAsync()`, `InitializeAsync(object)`, `Activated()` — all empty. - **`OnRaiseNotification(NotificationContentEventArgs)`** *(private)* Same behavior as in `HeadReportViewModel`. - **`OnBusyIndicatorNotification(bool)`** *(private)* Same behavior as in `HeadReportViewModel`. --- ## 3. Invariants - **View-ViewModel Binding**: Both `InputView` and `OutputView` have their `DataContext` set to `this` in the constructor. This binding is immutable after construction. - **Event Subscription**: Both view models subscribe to `RaiseNotification` and `BusyIndicatorChangeNotification` events during construction. Subscriptions are not cleaned up (no `Unsubscribe` calls). - **`IsBusy` State**: `IsBusy` is always set via `OnBusyIndicatorNotification(bool)` and never modified directly elsewhere in the code. - **`IsDirty` State**: `IsDirty` is read-only and *never set to `true`* in the provided code. Its value remains `false` for the lifetime of the object. - **`HeaderInfo`**: Always returns `"MainRegion"`; no dynamic behavior. - **`Test` Object**: In `TRLReportViewModel`, `Test` must be non-null before `PopulateChannels()` is called (called in constructor), or `Test.Channels` will throw `NullReferenceException`. - **Channel Population Logic**: `PopulateChannels()` only processes channels where `ch.emc is Event.Module.AnalogInputChannel`. Non-analog channels are skipped. - **Unit Matching**: Channel filtering uses `unit.UnitMatches(emc.EngineeringUnits)` — behavior depends on implementation of `UnitMatches`, not visible in source. --- ## 4. Dependencies ### Internal Dependencies (from imports) - **Prism Framework**: - `Microsoft.Practices.Prism.Events` (`IEventAggregator`, `RaiseNotification`, `BusyIndicatorChangeNotification`) - `Microsoft.Practices.Prism.Interactivity.InteractionRequest` (`InteractionRequest`, `Notification`, `Confirmation`) - `Microsoft.Practices.Prism.Regions` (`IRegionManager`) - `Microsoft.Practices.Prism.Commands` (`DelegateCommand`, *commented out but referenced*) - **Unity Container**: `Microsoft.Practices.Unity` (`IUnityContainer`) - **Common Libraries**: - `DTS.Common.Events` (`RaiseNotification`, `BusyIndicatorChangeNotification`, `NotificationContentEventArgs`) - `DTS.Common.Interface` (`IHeadReportInputView`, `IHeadReportOutputView`, `ITRLReportInputView`, `ITRLReportOutputView`, `IHeadReportViewModel`, `ITRLReportViewModel`) - `DTS.Common.Utils` (unused in visible code) - `DTS.Serialization.Test` (`Test` property in `TRLReportViewModel`) - `DTS.SensorDB.MeasurementUnitList`, `DTS.SensorDB.FilterClass`, `DTS.SensorDB.MeasurementUnit` - `PedestrianAndHeadReports.Classes` (`ConstantsAndEnums.TimeUnits`) - `DTS.Slice.Control` (unused in visible code) - **System Libraries**: - `System.ComponentModel` (`INotifyPropertyChanged`) - `System.Threading.Tasks` (`Task`) - `System.Linq` (`Where`, `AddRange`) - `System.Collections.Generic` (`List`, `Array`) - `System.Text` (unused in visible code) ### External Dependencies - **UI Framework**: WPF (inferred from Prism usage, `InteractionRequest`, and `OpenFileDialog` in commented code). - **Export Contracts**: - `IHeadReportInputView`, `IHeadReportOutputView` (for `HeadReportViewModel`) - `ITRLReportInputView`, `ITRLReportOutputView` (for `TRLReportViewModel`) These interfaces must be implemented by views in the UI layer. ### What Depends on This Module? - The application shell or region manager must import and display views of type `IHeadReportInputView`, `IHeadReportOutputView`, `ITRLReportInputView`, and `ITRLReportOutputView`. - Event publishers for `RaiseNotification` and `BusyIndicatorChangeNotification` must exist (e.g., a global busy indicator manager or notification service). --- ## 5. Gotchas - **`IsDirty` is never updated**: Both view models expose `IsDirty` as a read-only property, but it is never set to `true`. This may mislead consumers expecting change tracking. - **`NotImplementedException` in `TRLReportViewModel`**: `AvailableImpactorTypes` and `AvailableCFCs` throw `NotImplementedException`. Any binding to these properties will crash at runtime. - **`DateTimeText` setter is unsafe**: Uses `DateTime.Parse(value)` without culture or exception handling. May throw `FormatException` or `OverflowException` on invalid input. - **No cleanup logic**: `Cleanup()` and `CleanupAsync()` are empty stubs. Event subscriptions (`_eventAggregator.GetEvent<...>().Subscribe(...)`) are never unsubscribed, risking memory leaks. - **Channel population assumes non-null `Test`**: `PopulateChannels()` accesses `Test.Channels` without null checks. If `Test` is `null`, a `NullReferenceException` occurs during construction. - **`UnitMatches` behavior unknown**: Filtering channels relies on `unit.UnitMatches(...)`, whose implementation is not visible. May cause incorrect channel inclusion/exclusion. - **Redundant code**: Both view models duplicate identical logic for `OnRaiseNotification`, `OnBusyIndicatorNotification`, and lifecycle methods. Consider refactoring to a base class. - **Commented-out import logic**: Both files contain commented-out `ImportBrowseCommand` and related code. This suggests incomplete or deprecated functionality; avoid relying on it. - **Namespace `PedestrianAndHeadReports`**: Despite the namespace, `HeadReportViewModel` is *not* used for pedestrian reports (per file path and naming), only head reports. `TRLReportViewModel` appears to handle TRL (Test Report Layout) reports. - **`HeaderInfo` is hardcoded**: Returns `"MainRegion"` literally — likely a placeholder or legacy value with no dynamic meaning.