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

7.2 KiB
Raw Blame History

source_files, generated_at, model, schema_version, sha256
source_files generated_at model schema_version sha256
Common/DTS.Common.Property/ViewModel/PropertyViewModel.cs
2026-04-16T03:28:26.668106+00:00 Qwen/Qwen3-Coder-Next-FP8 1 07b6bc1210aae7cd

ViewModel

Documentation: PropertyViewModel Module


1. Purpose

The PropertyViewModel class serves as the view model for a property editing UI in the DTS (Data Tracking System) application, implementing Prisms MVVM pattern and integrating with Unity dependency injection and region management. It acts as a bridge between the IPropertyView UI layer and underlying domain data (_properties), while also exposing Prism InteractionRequests for displaying notifications and confirmations. It inherits from BaseViewModel<IGraphPropertyViewModel>, suggesting it participates in a broader graph-based property editing context (e.g., for editing properties of nodes/edges in a graph model), though current implementation is largely skeletal.


2. Public Interface

PropertyViewModel(IPropertyView view, IRegionManager regionManager, IEventAggregator eventAggregator, IUnityContainer unityContainer)

  • Behavior: Constructor. Assigns the provided view, sets view.DataContext = this, initializes NotificationRequest and ConfirmationRequest, registers OnRaiseNotification as a handler for the RaiseNotification event via EventAggregator, and stores references to infrastructure services.

InteractionRequest<Notification> NotificationRequest { get; }

  • Behavior: Prism interaction request used to raise notification popups (e.g., informational messages). Triggered internally via OnRaiseNotification when a RaiseNotification event is published.

InteractionRequest<Confirmation> ConfirmationRequest { get; }

  • Behavior: Prism interaction request used to raise confirmation dialogs (e.g., yes/no prompts). Currently unused in the provided source.

IPropertyView View { get; }

  • Behavior: Read-only reference to the associated view instance. Set during construction and never modified.

string HeaderInfo { get; }

  • Behavior: Returns the static header string "Graph Property".

object Properties { get; set; }

  • Behavior: Holds arbitrary property data (likely a domain object or DTO representing editable properties). Raises PropertyChanged when set.

override void Initialize(object parameter)

  • Behavior: Assigns Parent from the cast parameter to IBaseWindowModel. Note: Does not call base.Initialize(parameter).

void Initialize(object parameter, object properties)

  • Behavior: Assigns Parent and _properties from the respective parameters. Note: Does not raise PropertyChanged for Properties here — only the property setter does.

override event PropertyChangedEventHandler PropertyChanged

  • Behavior: Overrides base INotifyPropertyChanged implementation. Note: Uses new to hide base implementation.

override void Cleanup(), override Task CleanupAsync(), override void Activated(), override Task InitializeAsync(), override Task InitializeAsync(object parameter)

  • Behavior: All currently throw NotImplementedException. These lifecycle methods are declared but not implemented.

override void Initialize(), override Task InitializeAsync()

  • Behavior: Empty overrides (no-op). No base call or logic.

3. Invariants

  • View.DataContext is always set to this (PropertyViewModel instance) immediately after construction.
  • NotificationRequest and ConfirmationRequest are initialized once and never reassigned.
  • EventAggregator.GetEvent<RaiseNotification>().Subscribe(OnRaiseNotification) is called exactly once in the constructor — implying a single subscription for the lifetime of the instance (no unsubscription logic is present).
  • Parent is assigned only via Initialize(object parameter) or Initialize(object parameter, object properties) — not in the constructor.
  • Properties property setter triggers OnPropertyChanged("Properties"), ensuring UI binding updates.

4. Dependencies

External Dependencies (via imports):

  • DTS.Common.BaseBaseViewModel<IGraphPropertyViewModel>
  • DTS.Common.EventsRaiseNotification, NotificationContentEventArgs
  • DTS.Common.InterfaceIPropertyView, IBaseWindowModel, IGraphPropertyViewModel
  • Microsoft.Practices.Prism.EventsIEventAggregator, EventAggregator
  • Microsoft.Practices.Prism.Interactivity.InteractionRequestInteractionRequest<T>, Notification, Confirmation
  • Microsoft.Practices.Prism.RegionsIRegionManager
  • Microsoft.Practices.UnityIUnityContainer

Internal Dependencies (inferred):

  • BaseViewModel<IGraphPropertyViewModel> — base class providing region/event/container infrastructure.
  • RaiseNotification event (from DTS.Common.Events) — expected to be published elsewhere in the system to trigger notifications via this VM.
  • IBaseWindowModel — expected to be passed as parameter during initialization (likely represents a parent window or graph context).
  • IPropertyView — must be provided at construction; implies a corresponding view class implementing this interface.

Depended upon by:

  • Likely consumed by Prism region navigation (e.g., via IRegionManager.RequestNavigate) given IRegionManager usage.
  • IUnityContainer usage suggests it is registered and resolved via Unity DI.

5. Gotchas

  • Critical Unimplemented Methods: Activated(), Cleanup(), CleanupAsync(), InitializeAsync(), and InitializeAsync(object) all throw NotImplementedException. This may cause runtime failures if Prisms lifecycle expects these to be called (e.g., during region navigation or view disposal).
  • Missing IsBusy/IsDirty Implementation: Properties IsBusy and IsDirty throw NotImplementedException in both getter and setter — likely placeholders.
  • No Unsubscription from RaiseNotification Event: The constructor subscribes to RaiseNotification but never unsubscribes. If PropertyViewModel instances are long-lived or reused, this could lead to memory leaks or duplicate notifications.
  • Properties setter uses "Properties" string literal: Prone to refactoring errors (e.g., renaming field/property without updating string). No nameof() usage.
  • new keyword usage: new event PropertyChangedEventHandler, new IRegionManager, new bool IsBusy, new bool IsDirty — suggests the base class (BaseViewModel<...>) declares members with the same names. This can cause confusion and subtle bugs if consumers expect base behavior.
  • NotificationRequest.Raise(...) expects NotificationContentEventArgsWithoutTitle: The comment states the Notification object expects a NotificationContentEventArgsWithoutTitle, but the code constructs a NotificationContentEventArgs. This mismatch may indicate a bug or undocumented type alias/conversion — unclear from source alone.
  • No validation or null checks: parameter is cast directly to IBaseWindowModel — will throw InvalidCastException if incorrect type is passed.

None identified from source alone.Correction: The above gotchas are apparent from source analysis.