--- source_files: - Common/DTS.Common.Property/ViewModel/PropertyViewModel.cs generated_at: "2026-04-16T03:28:26.668106+00:00" model: "Qwen/Qwen3-Coder-Next-FP8" schema_version: 1 sha256: "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 Prism’s 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 `InteractionRequest`s for displaying notifications and confirmations. It inherits from `BaseViewModel`, 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 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 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().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.Base` → `BaseViewModel` - `DTS.Common.Events` → `RaiseNotification`, `NotificationContentEventArgs` - `DTS.Common.Interface` → `IPropertyView`, `IBaseWindowModel`, `IGraphPropertyViewModel` - `Microsoft.Practices.Prism.Events` → `IEventAggregator`, `EventAggregator` - `Microsoft.Practices.Prism.Interactivity.InteractionRequest` → `InteractionRequest`, `Notification`, `Confirmation` - `Microsoft.Practices.Prism.Regions` → `IRegionManager` - `Microsoft.Practices.Unity` → `IUnityContainer` #### **Internal Dependencies (inferred):** - `BaseViewModel` — 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 Prism’s 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.