Files

147 lines
7.1 KiB
Markdown
Raw Permalink Normal View History

2026-04-17 14:55:32 -04:00
---
source_files:
- DataPRO/Modules/SystemSettings/QASettings/ViewModel/QASettingsViewModel.cs
generated_at: "2026-04-16T04:41:41.270479+00:00"
model: "Qwen/Qwen3-Coder-Next-FP8"
schema_version: 1
sha256: "26d85367d0fdc737"
---
# ViewModel
## Documentation: QASettingsViewModel
---
### 1. Purpose
The `QASettingsViewModel` serves as the view model for the QA Settings module in the application, implementing the `IQASettingsViewModel` interface and adhering to Prisms MVVM pattern. It acts as the intermediary between the `IQASettingsView` UI and underlying system services (e.g., event aggregation, region management, dependency injection), enabling UI-driven interactions such as displaying notifications, managing busy state, and exposing configuration-related properties (e.g., counts of sensors, test setups). It also subscribes to global events (`RaiseNotification`, `BusyIndicatorChangeNotification`) to synchronize UI state with application-wide events.
---
### 2. Public Interface
#### `QASettingsViewModel` (class)
- **`IQASettingsView View { get; }`**
Reference to the associated view instance; set during construction and used to bind `DataContext`.
- **`InteractionRequest<Notification> NotificationRequest { get; }`**
Prism interaction request used to trigger notification popups (e.g., informational messages). Raised via `OnRaiseNotification`.
- **`InteractionRequest<Confirmation> ConfirmationRequest { get; }`**
Prism interaction request used to trigger confirmation dialogs (currently declared but not used in the provided source).
- **`bool IsBusy { get; set; }`**
Indicates whether the view/model is currently performing a long-running operation. Bound to a busy indicator in the UI.
- **`bool IsDirty { get; }`**
Property indicating whether changes have been made (currently always `false`; no logic implemented to set it).
- **`bool IsMenuIncluded { get; set; }`**
Controls visibility of the menu in the view (default `false`).
- **`bool IsNavigationIncluded { get; set; }`**
Controls visibility of navigation controls in the view (default `false`).
- **`string HeaderInfo { get; }`**
Returns the literal string `"MainRegion"`; likely used as a header or region identifier.
- **`string NumberOfSensorModelsText { get; set; }`**
String representation of `_numberOfSensorModels` (formatted with thousand separators); setter parses input to `int`.
- **`string NumberOfTestSetupsText { get; set; }`**
String representation of `_numberOfTestSetups`.
- **`string NumberOfGroupsText { get; set; }`**
String representation of `_numberOfGroups`.
- **`string NumberOfSensorsText { get; set; }`**
String representation of `_numberOfSensors`.
- **`string NumberOfGroupTemplatesText { get; set; }`**
String representation of `_numberOfGroupTemplates`.
- **`DelegateCommand CreateCommand { get; }`**
Command bound to a UI action (e.g., a button). Invokes `CreateMethod()` asynchronously (note: `async void`—see *Gotchas*).
#### Interface Implementations
- **`void Cleanup()` / `Task CleanupAsync()`**
No-op stubs; no cleanup logic implemented.
- **`void Initialize()` / `void Initialize(object parameter)` / `void Initialize(object parameter, object model)` / `Task InitializeAsync()` / `Task InitializeAsync(object parameter)`**
No-op stubs; no initialization logic implemented.
- **`void Activated()`**
No-op stub; likely part of Prisms `INavigationAware` or custom lifecycle interface.
- **`event PropertyChangedEventHandler PropertyChanged`**
Standard `INotifyPropertyChanged` implementation; used for data binding.
- **`void OnPropertyChanged(string propertyName)`**
Raises `PropertyChanged` event for the given property.
- **`bool SetProperty<T>(ref T storage, T value, string propertyName = null)`**
Declared but throws `NotImplementedException`; not used.
- **`void IBasePropertyChanged.OnPropertyChanged(string propertyName)`**
Explicit interface implementation of `IBasePropertyChanged.OnPropertyChanged`, delegating to `OnPropertyChanged`.
---
### 3. Invariants
- `View.DataContext` is always set to `this` (the view model instance) during construction.
- `_eventAggregator` subscriptions are established in the constructor and persist for the lifetime of the instance.
- `IsBusy` is updated synchronously in response to `BusyIndicatorChangeNotification` events.
- `NumberOf*Text` properties parse their setters as `int` without validation—invalid input will throw `FormatException`.
- `IsDirty` is read-only and never set to `true` in the current implementation.
- `NotificationRequest` is raised with a `Notification` object containing a `NotificationContentEventArgs` (with empty strings for unused fields) and the original title.
- The class is marked `[PartCreationPolicy(CreationPolicy.Shared)]`, implying a singleton lifetime within the MEF container.
---
### 4. Dependencies
#### Imports / Dependencies
- **Prism Framework**:
- `Prism.Events.IEventAggregator` (for event pub/sub)
- `Prism.Regions.IRegionManager` (for region navigation)
- `Prism.Commands.DelegateCommand` (for command binding)
- `Prism.Interactivity.InteractionRequest` (for popup notifications)
- **Unity Container**: `IUnityContainer` (dependency injection)
- **Custom Interfaces/Events**:
- `IQASettingsView` (view interface)
- `DTS.Common.Events.RaiseNotification`, `DTS.Common.Events.BusyIndicatorChangeNotification` (event types)
- `DTS.Common.Base.IBasePropertyChanged` (custom interface)
- **System Components**: `System.ComponentModel.INotifyPropertyChanged`, `System.Threading.Tasks.Task`
#### Exports / Used By
- Exported as `IQASettingsView` via `[Export(typeof(IQASettingsView))]`, implying it is consumed by a Prism region or view locator expecting that interface.
- Likely consumed by the `QASettingsView` UI (e.g., XAML view bound to this VM).
---
### 5. Gotchas
- **`async void` in `CreateMethod()`**:
The `CreateMethod()` handler is `async void`, which is generally discouraged (no way to await or handle exceptions properly). This may lead to unobserved exceptions.
- **`SetProperty` throws `NotImplementedException`**:
The `SetProperty` method (commonly used in MVVM to reduce boilerplate for property setters) is declared but unimplemented. This suggests incomplete refactoring or copy-paste from a base class.
- **No validation in property setters**:
All `NumberOf*Text` setters use `int.Parse(value)` without error handling. Invalid input (e.g., non-numeric strings) will crash the UI thread.
- **Unused `ConfirmationRequest`**:
Declared but never raised—likely leftover from design or future use.
- **`IsDirty` is always `false`**:
No logic tracks changes; this property is effectively dead code.
- **`HeaderInfo` is hardcoded**:
Returns `"MainRegion"` literally—likely a placeholder or misnamed constant.
- **`IBasePropertyChanged` interface**:
Custom interface (not `INotifyPropertyChanged`) is implemented explicitly, but its purpose is unclear from this file alone.
- **No disposal logic**:
`_eventAggregator` subscriptions are not unsubscribed in `Cleanup()`/`CleanupAsync()`—risk of memory leaks if the view model outlives its view.