--- source_files: - DataPRO/Modules/SystemSettings/UISettings/ViewModel/ISOSettingsViewModel.cs generated_at: "2026-04-16T04:41:03.637144+00:00" model: "Qwen/Qwen3-Coder-Next-FP8" schema_version: 1 sha256: "38bf1bb83bea5e37" --- # ViewModel ## Documentation: `UISettingsViewModel` --- ### 1. **Purpose** `UISettingsViewModel` is the view model for the UI Settings module, responsible for managing UI-related state and mediating interactions between the view (`IUISettingsView`) and the broader application infrastructure (e.g., event aggregation, region management, dependency injection). It implements the `IUISettingsViewModel` interface and is exported as a shared singleton via MEF (`[Export(typeof(IUISettingsView))]`). Its primary role is to expose properties that control UI layout (e.g., `IsMenuIncluded`, `IsNavigationIncluded`) and to translate application-level events (`RaiseNotification`, `BusyIndicatorChangeNotification`) into Prism `InteractionRequest` triggers for UI notifications and busy indicators. --- ### 2. **Public Interface** #### `class UISettingsViewModel : BasePropertyChanged, IUISettingsViewModel` - **Constructor** ```csharp public UISettingsViewModel(IUISettingsView view, IRegionManager regionManager, IEventAggregator eventAggregator, IUnityContainer unityContainer) ``` Initializes the view model with required dependencies, sets `View.DataContext = this`, registers event handlers for `RaiseNotification` and `BusyIndicatorChangeNotification` events, and initializes `NotificationRequest` and `ConfirmationRequest`. - **`void Cleanup()`** No-op stub. Intended for cleanup logic but currently does nothing. - **`Task CleanupAsync()`** Returns `Task.CompletedTask`. No-op stub for async cleanup. - **`void Initialize()`** No-op stub. - **`void Initialize(object parameter)`** No-op stub. - **`void Initialize(object parameter, object model)`** No-op stub. - **`Task InitializeAsync()`** Returns `Task.CompletedTask`. No-op stub. - **`Task InitializeAsync(object parameter)`** Returns `Task.CompletedTask`. No-op stub. - **`void Activated()`** No-op stub. #### Properties - **`IUISettingsView View { get; }`** Reference to the associated view instance. Set during construction. - **`InteractionRequest NotificationRequest { get; }`** Prism `InteractionRequest` used to trigger notification popups (e.g., informational messages). - **`InteractionRequest ConfirmationRequest { get; }`** Prism `InteractionRequest` for confirmation dialogs (declared but *not used* in current implementation). - **`bool IsDirty { get; }`** Read-only property; always `false` (never set). Intended for tracking unsaved changes. - **`bool IsBusy { get; set; }`** Bindable property reflecting busy state. Set via `OnBusyIndicatorNotification(bool)` in response to `BusyIndicatorChangeNotification` events. - **`bool IsMenuIncluded { get; set; }`** Bindable property indicating whether the menu UI element should be included. Defaults to `false`. - **`bool IsNavigationIncluded { get; set; }`** Bindable property indicating whether the navigation UI element should be included. Defaults to `false`. - **`string HeaderInfo { get; }`** Returns the constant `"MainRegion"`. Used as a header identifier (purpose unclear without further context). --- ### 3. **Invariants** - `View.DataContext` is always set to `this` during construction. - `IsBusy` is updated *only* in response to `BusyIndicatorChangeNotification` events (via `OnBusyIndicatorNotification`). - `NotificationRequest` is triggered *only* via `OnRaiseNotification`, which wraps `NotificationContentEventArgs` into a `Notification` object with an empty `Message` and `Title` fields in the inner `NotificationContentEventArgs` (see `Gotchas`). - `IsDirty` is never set to `true`; its value is always `false`. - `IsMenuIncluded` and `IsNavigationIncluded` default to `false` and are mutable via property setters. --- ### 4. **Dependencies** #### Imports / Dependencies - **Prism**: `IEventAggregator`, `IRegionManager`, `InteractionRequest`, `Notification`, `Confirmation`. - **Unity**: `IUnityContainer`. - **DTS Common Libraries**: - `DTS.Common.Base.BasePropertyChanged` (base class for property change notifications). - `DTS.Common.Events.RaiseNotification`, `BusyIndicatorChangeNotification` (event types). - `DTS.Common.Interactivity.NotificationContentEventArgs`, `NotificationContentEventArgsWithoutTitle` (used in event handling). - `DTS.Common.Interface.IUISettingsView`, `IUISettingsViewModel` (view/view model interfaces). - **MEF**: `[Export]` and `[PartCreationPolicy(CreationPolicy.Shared)]` indicate integration with a MEF-based composition container. #### Depends On - `IUISettingsView` (the view it binds to). - `RaiseNotification` and `BusyIndicatorChangeNotification` events (published externally). - `NotificationContentEventArgs` and `NotificationContentEventArgsWithoutTitle` types (used in event handling logic). #### Consumed By - The application shell or main region manager (via `IRegionManager`) to host this view model’s view. - Any module/component that publishes `RaiseNotification` or `BusyIndicatorChangeNotification` events. --- ### 5. **Gotchas** - **`NotificationContentEventArgsWithoutTitle` is referenced in comments but not defined in source**: The comment in `OnRaiseNotification` mentions `NotificationContentEventArgsWithoutTitle`, but this type is not imported or used in the code. This suggests either: - A mismatch between documentation and implementation, or - A missing type definition (potential compile-time error if not defined elsewhere). - **`NotificationRequest` uses a modified `NotificationContentEventArgs`**: In `OnRaiseNotification`, a new `NotificationContentEventArgs` is constructed with empty strings for `Title` and `Message` fields (`new NotificationContentEventArgs(eventArgsWithTitle.Message, "", eventArgsWithTitle.Image, "")`). This contradicts the comment that says it expects a `NotificationContentEventArgsWithoutTitle` object. Likely indicates legacy or incomplete refactoring. - **`ConfirmationRequest` is declared but never used**: No code raises `ConfirmationRequest`, suggesting it is unused or reserved for future use. - **`IsDirty` is never updated**: Despite being a public property, it is never set to `true`, making it effectively inert. This may indicate incomplete implementation or a design oversight. - **`HeaderInfo` returns a hardcoded `"MainRegion"`**: Its purpose is unclear; it may be a remnant of region naming conventions but is not used in the current code. - **`Initialize*` and `Cleanup*` methods are no-ops**: All overloads are stubbed. If the module expects initialization logic (e.g., loading settings), it is not implemented here. - **Thread context for `BusyIndicatorChangeNotification`**: The subscription uses `ThreadOption.PublisherThread`, meaning the handler runs on the publisher’s thread. If publishers are non-UI threads, this could cause cross-thread UI exceptions unless `SetProperty` (from `BasePropertyChanged`) is thread-safe. > **Note**: No usage of `UnityContainer`, `_regionManager`, or `_eventAggregator` beyond initialization and event subscription is present. Their purpose is unclear in the current implementation.