109 lines
6.7 KiB
Markdown
109 lines
6.7 KiB
Markdown
---
|
||
source_files:
|
||
- DataPRO/Modules/Hardware/AddEditHardware/View/AddEditHardwareView.xaml.cs
|
||
generated_at: "2026-04-16T04:35:38.785908+00:00"
|
||
model: "Qwen/Qwen3-Coder-Next-FP8"
|
||
schema_version: 1
|
||
sha256: "0ee538e93daa667b"
|
||
---
|
||
|
||
# View
|
||
|
||
## Documentation: `AddEditHardwareView` (WPF View for Hardware Configuration)
|
||
|
||
---
|
||
|
||
### **1. Purpose**
|
||
|
||
The `AddEditHardwareView` class is the WPF UI view layer for configuring and editing hardware devices in the system. It implements the `IAddEditHardwareView` interface and `INotifyPropertyChanged` to support data binding, and is responsible for rendering hardware type selection, module management (add/remove), and dynamic UI updates based on database version and view model state. It acts as the presentation layer for the `AddEditHardwareViewModel`, coordinating user interactions (e.g., button clicks, selection changes, text input) with the underlying data model via event handlers and property synchronization.
|
||
|
||
---
|
||
|
||
### **2. Public Interface**
|
||
|
||
#### **Properties**
|
||
- **`public bool AllowStandin { get; }`**
|
||
Determines whether the SLICE6TreeView UI element should be visible. Returns `true` if `DataContext` is null or not an `IAddEditHardwareViewModel`; otherwise, delegates to `vm.AllowStandin`.
|
||
|
||
- **`public int ViewDbVersion { get; set; }`**
|
||
Gets or sets the database version used to filter available hardware types. Setting this clears the cached hardware type list (`_allDASTypes`) and refreshes the `cbHardwareTypes.ItemsSource`.
|
||
|
||
#### **Methods**
|
||
- **`public void Activated()`**
|
||
Called when the view is activated. Triggers a property change notification for `AllowStandin`, and if `vm.SLICE6TreeView` is non-null, assigns it to `SLICE6TreeView.Content`.
|
||
|
||
#### **Event Handlers (Private, but part of public behavior via XAML wiring)**
|
||
- **`private void btnRemoveModule_Click(object sender, RoutedEventArgs e)`**
|
||
Removes the module associated with the clicked button’s `DataContext` from its owning hardware, then notifies the view model of modification.
|
||
|
||
- **`private void btnAdd_Click(object sender, RoutedEventArgs e)`**
|
||
Adds a new module to the hardware associated with the clicked button’s `DataContext`, then notifies the view model of modification.
|
||
|
||
- **`private void cb_SelectionChanged(object sender, SelectionChangedEventArgs e)`**,
|
||
**`private void cb_Checked(object sender, RoutedEventArgs e)`**,
|
||
**`private void cb_Unchecked(object sender, RoutedEventArgs e)`**,
|
||
**`private void tb_TextChanged(object sender, TextChangedEventArgs e)`**
|
||
All invoke `vm.NotifyModified()` to signal that the underlying data has changed.
|
||
|
||
#### **Protected/Helper Methods (Not public API, but part of implementation)**
|
||
- **`protected bool SetProperty<T>(ref T storage, T value, string propertyName = null)`**
|
||
Implements `INotifyPropertyChanged` semantics: updates `storage` only if value differs, raises `PropertyChanged`, and returns `true` if changed.
|
||
|
||
- **`protected void OnPropertyChanged(string propertyName = null)`**
|
||
Raises the `PropertyChanged` event.
|
||
|
||
---
|
||
|
||
### **3. Invariants**
|
||
|
||
- **Thread Safety for Hardware Type Caching**:
|
||
`_allDASTypes` is populated and cleared under a `lock` on the static list. `AvailableDASType()` and `PopulateDASTypes()` use this lock to ensure thread-safe initialization and version-based filtering.
|
||
|
||
- **Database Version Dependency**:
|
||
The list of available hardware types (`_allDASTypes`) is *dynamically filtered* based on `ViewDbVersion`. Specific hardware types (e.g., `SLICE6_AIR_BR`, `SLICE6_AIR_TC`, `SLICE_PRO_CAN_FD`) are only included if `ConnectionDbVersion` meets or exceeds their respective version constants (`Constants.SLICE6AIR_BR_DB_VERSION`, etc.).
|
||
|
||
- **View Model Contract**:
|
||
The view assumes `DataContext` is an `IAddEditHardwareViewModel` (or `AddEditHardwareViewModel` in handlers). If not, operations silently exit (e.g., `vm.NotifyModified()` is not called).
|
||
|
||
- **Module Ownership**:
|
||
Module removal (`btnRemoveModule_Click`) requires the `DataContext` of the clicked control to be an `IAddEditHardwareDASModule` with a valid `OwningHardware` reference.
|
||
|
||
---
|
||
|
||
### **4. Dependencies**
|
||
|
||
#### **Imports / Dependencies Used**
|
||
- **`DTS.Common`**: Core types, including `Constants`, `DbOperations`, `EnumDescriptionTypeConverter`.
|
||
- **`DTS.Common.Converters`**: `EnumDescriptionTypeConverter` used for sorting hardware types by description.
|
||
- **`DTS.Common.Enums.Hardware`**: `HardwareTypes`, `SLICEPROSIMConfigurations`, `SLICETCConfigurations`, `RackSizes`.
|
||
- **`DTS.Common.Interface.Hardware.AddEditHardware`**: `IAddEditHardwareView`, `IAddEditHardwareViewModel`, `IAddEditHardwareDASModule`, `IAddEditHardwareHardware`.
|
||
- **WPF Framework**: `System.Windows`, `System.Windows.Controls`, `System.ComponentModel`.
|
||
|
||
#### **Assumed Dependencies**
|
||
- **`AddEditHardwareViewModel`**: Concrete implementation of `IAddEditHardwareViewModel`, used in handlers (e.g., `vm.NotifyModified()`).
|
||
- **XAML file `AddEditHardwareView.xaml`**: Defines UI controls like `cbHardwareTypes`, `cbSliceProSimConfigurations`, `SLICE6TreeView`, etc., which are referenced in code-behind.
|
||
- **`Constants` class**: Must define `SLICE6AIR_BR_DB_VERSION`, `SLICE_TC_DB_VERSION`, `SLICE_PRO_CAN_FD_DB_VERSION`, and `MINIMUM_LTS_DB_VERSION`.
|
||
|
||
---
|
||
|
||
### **5. Gotchas**
|
||
|
||
- **Static State Mutation on Version Change**:
|
||
Setting `ViewDbVersion` clears `_allDASTypes` *globally*, affecting all instances of `AddEditHardwareView` in the app domain. This is a shared static cache—changing version for one view resets hardware type availability for others.
|
||
|
||
- **Silent Failures on Invalid Contexts**:
|
||
Event handlers (`btnRemoveModule_Click`, `btnAdd_Click`, `cb_*`, `tb_TextChanged`) exit early if `DataContext` is not the expected type or if `ctrlView.DataContext` is not `AddEditHardwareViewModel`. No error is logged or thrown—behavior is silently skipped.
|
||
|
||
- **`AllowStandin` Logic is Inverted in Edge Cases**:
|
||
Returns `true` (i.e., *show* the tree view) when `DataContext` is null or not an `IAddEditHardwareViewModel`. This may be counterintuitive—typically, missing view model would imply *hiding* UI elements.
|
||
|
||
- **Hardware Type Sorting Relies on Enum Descriptions**:
|
||
`_allDASTypes.Sort()` uses `EnumDescriptionTypeConverter.GetEnumDescription()` for ordering. If descriptions are missing, empty, or non-unique, sorting may be inconsistent or throw.
|
||
|
||
- **No Validation on `ViewDbVersion`**:
|
||
`ViewDbVersion` accepts any `int`. If set to a value below `MINIMUM_LTS_DB_VERSION`, behavior is undefined (though `_allDASTypes` is cleared and repopulated using the provided version).
|
||
|
||
- **Hardcoded Configuration Arrays**:
|
||
`_availableSliceProSimConfigurations`, `_availableSliceTCConfigurations`, and `_availableRackSizes` are static and unversioned—no dynamic filtering based on database version is applied to these.
|
||
|
||
None identified beyond the above. |