Files
DP44/enriched-qwen3-coder-next/DTS Viewer/DTS.Viewer.Modules/DTS.Viewer.ViewerSettings/ViewModel.md
2026-04-17 14:55:32 -04:00

6.5 KiB

source_files, generated_at, model, schema_version, sha256
source_files generated_at model schema_version sha256
DTS Viewer/DTS.Viewer.Modules/DTS.Viewer.ViewerSettings/ViewModel/ViewerSettingsViewModel.cs
2026-04-16T13:49:48.286150+00:00 zai-org/GLM-5-FP8 1 f93455d3d5a535ba

Documentation: ViewerSettingsViewModel

1. Purpose

ViewerSettingsViewModel is a Prism-based view model for the Viewer Settings module within the DTS Viewer application. It manages user-configurable settings related to calibration behaviors, handles visibility states for settings UI elements, and coordinates with parent view models via event aggregation. The class serves as the binding context for IViewerSettingsView and participates in the application's region-based navigation system.


2. Public Interface

Constructor

public ViewerSettingsViewModel(
    IViewerSettingsView view, 
    IRegionManager regionManager, 
    IEventAggregator eventAggregator,
    IUnityContainer unityContainer)

Initializes the view model, sets the view's DataContext to itself, and creates NotificationRequest and ConfirmationRequest interaction requests.

Methods

public override void Initialize()

Empty override. No initialization logic performed.

public override void Initialize(object parameter)

Sets Parent property from the provided parameter (cast to IBaseViewModel) and calls Subscribe() to register event handlers.

public void PublishChanges()

Empty implementation. No behavior defined in source.

Properties

Property Type Description
View IViewerSettingsView Gets/sets the associated view interface.
Parent IBaseViewModel Gets/sets the parent view model reference.
NotificationRequest InteractionRequest<Notification> Interaction request for notifications.
ConfirmationRequest InteractionRequest<Confirmation> Interaction request for confirmations (hides base member with new).
HeaderInfo string Returns constant string "SettingsRegion".
IsBusy bool Gets/sets busy state (hides base member with new).
IsDirty bool Gets/sets dirty state (hides base member with new).
IsNavigationIncluded bool Gets/sets navigation inclusion flag (hides base member with new).
CalibrationBehaviorSettingVisibility Visibility Controls visibility of calibration behavior setting UI. Publishes ViewerSettingsVisibilityChangedEvent when changed.
OverallSettingsVisibility Visibility Computed property; returns Visibility.Visible if CalibrationBehaviorSettingVisibility is visible, otherwise Visibility.Collapsed.
AvailableCalibrationBehaviors DisplayedCalibrationBehavior[] Lazily-initialized, thread-safe array of three calibration behavior options: _linearIfAvail, _nonLinearIfAvail, _useBothIfAvail.
CalibrationBehaviorSetting DisplayedCalibrationBehavior Gets/sets the selected calibration behavior. Defaults to CalibrationBehaviors.NonLinearIfAvailable. Publishes CalibrationBehaviorSettingChangedEvent when changed.

Events

public new event PropertyChangedEventHandler PropertyChanged

Hides base class event. Raised via OnPropertyChanged(string).


3. Invariants

  • Default Calibration Behavior: _calibrationBehaviorSetting is always initialized to CalibrationBehaviors.NonLinearIfAvailable.
  • OverallSettingsVisibility Dependency: OverallSettingsVisibility is always Visibility.Collapsed when CalibrationBehaviorSettingVisibility is Visibility.Collapsed. It cannot be visible independently.
  • Thread Safety: AvailableCalibrationBehaviors getter uses a lock (MyLock) to ensure thread-safe lazy initialization.
  • CalibrationBehaviorSetting Getter: Always returns a matching DisplayedCalibrationBehavior from AvailableCalibrationBehaviors array, or null if no match found.
  • Event Subscription Timing: Subscriptions occur only after Initialize(object parameter) is called, not in the constructor.

4. Dependencies

External Dependencies (from imports)

  • Prism.Events - IEventAggregator for pub/sub messaging
  • Prism.Regions - IRegionManager for region-based navigation
  • Unity - IUnityContainer for dependency injection
  • DTS.Common.Base - BaseViewModel<T>, IBaseViewModel
  • DTS.Common.Classes.Sensors - DisplayedCalibrationBehavior
  • DTS.Common.Enums.Sensors - CalibrationBehaviors enum
  • DTS.Common.Events - CalibrationBehaviorSettingChangedEvent, CalibrationBehaviorSettableInViewerChangedEvent, ViewerSettingsVisibilityChangedEvent
  • DTS.Common.Interactivity - InteractionRequest<T>, Notification, Confirmation
  • DTS.Common.Interface - IViewerSettingsViewModel
  • System.Windows - Visibility enum

Consumed Events

  • CalibrationBehaviorSettingChangedEvent - payload: CalibrationBehaviors
  • CalibrationBehaviorSettableInViewerChangedEvent - payload: bool

Published Events

  • CalibrationBehaviorSettingChangedEvent - published when CalibrationBehaviorSetting setter is invoked with a different value
  • ViewerSettingsVisibilityChangedEvent - published when CalibrationBehaviorSettingVisibility is set

5. Gotchas

  1. Misleading XML Documentation: The constructor's XML comment references TestSummaryViewListModel, which appears to be a copy-paste error from another class.

  2. Member Hiding with new Keyword: Multiple members (PropertyChanged, OnPropertyChanged, IsBusy, IsDirty, IsNavigationIncluded, ConfirmationRequest) hide base class members using new. This breaks polymorphism—consumers casting to the base type will invoke base implementations, not these overrides.

  3. Empty PublishChanges() Method: The method has no implementation. Its intended purpose is unclear from source alone.

  4. Cascading Visibility Notifications: OnPropertyChanged has special logic—any property name ending with "Visibility" (except "OverallSettingsVisibility") triggers an additional OnPropertyChanged("OverallSettingsVisibility") call. This side effect is not obvious from property setters alone.

  5. Potential Null Return: CalibrationBehaviorSetting getter returns null if _calibrationBehaviorSetting does not match any item in AvailableCalibrationBehaviors. Callers should handle this possibility.

  6. No Unsubscribe Logic: The class subscribes to events in Subscribe() but does not appear to unsubscribe. Potential memory leak if view model lifecycle is shorter than the event aggregator's.