--- source_files: - DataPRO/Modules/SystemSettings/DBImportExport/ViewModel/DBViewModel.cs generated_at: "2026-04-16T04:40:45.205601+00:00" model: "Qwen/Qwen3-Coder-Next-FP8" schema_version: 1 sha256: "197f884be4481037" --- # ViewModel ## Documentation: `DBViewModel` (`DBImportExport` Module) --- ### 1. **Purpose** The `DBViewModel` class serves as the view model for database import and export functionality within the DataPRO application. It acts as a bridge between the UI (via `IDBImportView` and `IDBExportView`) and the underlying data layer, handling user interactions for selecting import/export files, validating data, and performing file I/O operations using XML strings. Due to architectural constraints (legacy DataPRO objects reside in a separate project), its functionality is currently limited to managing XML string data flow—*not* direct database manipulation. --- ### 2. **Public Interface** #### **Constructor** ```csharp public DBViewModel( IDBImportView importView, IDBExportView exportView, IRegionManager regionManager, IEventAggregator eventAggregator, IUnityContainer unityContainer) ``` - Initializes the view model with views, region/event management, and dependency injection containers. - Sets `DataContext` of both views to `this`. - Subscribes to `RaiseNotification` and `BusyIndicatorChangeNotification` events. #### **Lifecycle Methods (No-op)** All lifecycle methods currently have empty implementations: - `void Cleanup()` - `Task CleanupAsync()` - `void Initialize()` - `void Initialize(object parameter)` - `void Initialize(object parameter, object model)` - `Task InitializeAsync()` - `Task InitializeAsync(object parameter)` - `void Activated()` #### **Event Handlers (Internal)** - `private void OnBusyIndicatorNotification(bool eventArg)` Sets `IsBusy` to `eventArg`. - `private void OnRaiseNotification(NotificationContentEventArgs eventArgsWithTitle)` Converts `NotificationContentEventArgs` to `Notification` and raises `NotificationRequest`. #### **Public Methods** - `public void Export()` Writes `ExportData` (XML string) to `ExportFileName` using `Encoding.Unicode`. **Validation checks**: - Fails early if `ExportFileName` or `ExportData` is null/whitespace, publishing a `ShowStatus` event with failure message. - If `ExportFileName` already exists, deletes/moves it via `FileUtils.DeleteFileOrMove`. - Writes file using `File.WriteAllText`. #### **Interaction Requests (Public)** - `public InteractionRequest NotificationRequest { get; }` Used to trigger notification popups (e.g., success/error messages). - `public InteractionRequest ConfirmationRequest { get; }` Reserved for confirmation dialogs (not used in current implementation). #### **Commands (Public)** - `public DelegateCommand ImportBrowseCommand { get; }` Opens an `OpenFileDialog` to select an import file. Sets `ImportFileName` and updates `ImportStatusText`. - `public DelegateCommand ExportBrowseCommand { get; }` Opens a `SaveFileDialog` to set `ExportFileName`. #### **Properties (Public)** - `IDBImportView ImportView { get; set; }` Reference to the import view instance. - `IDBExportView ExportView { get; set; }` Reference to the export view instance. - `bool IsDirty { get; private set; }` Always `false` (never set). - `bool IsBusy { get; set; }` Bound to busy indicator; updated via `OnBusyIndicatorNotification`. - `bool IsMenuIncluded { get; set; }` Property exposed for UI binding (value never read/written beyond property setter). - `bool IsNavigationIncluded { get; set; }` Same as above. - `string HeaderInfo { get; }` Hardcoded to `"MainRegion"`. - `string ImportData { get; set; }` XML string for imported data (no import logic implemented—only storage). - `string ExportData { get; set; }` XML string for exported data (no export logic implemented—only storage). - `string ExportFileName { get; set; }` Full path to export file. - `string ImportFileName { get; set; }` Full path to import file. - `string ImportStatusText { get; set; }` Status message for import UI (e.g., warning about database overwrite). - `event PropertyChangedEventHandler PropertyChanged` Implements `INotifyPropertyChanged`. - `void OnPropertyChanged(string propertyName)` Raises `PropertyChanged` event. #### **Nested Type** - `public enum PropertyNames` Lists property names used in `OnPropertyChanged`: `ExportFileName`, `ImportFileName`, `ImportStatusText`. --- ### 3. **Invariants** - `Export()` **requires**: - `ExportFileName` must be non-null/non-whitespace. - `ExportData` must be non-null/non-whitespace. - `Export()` **guarantees**: - If file exists at `ExportFileName`, it is deleted/moved before writing. - File is written using `Encoding.Unicode`. - `ImportBrowseMethod()`: - Uses `OpenFileDialog` with `CheckFileExists = true` and `CheckPathExists = true`. - Sets `ImportFileName` only if dialog succeeds. - `ExportBrowseMethod()`: - Uses `SaveFileDialog` with `OverwritePrompt = false`. - Sets `ExportFileName` only if dialog succeeds. - `IsBusy` is updated synchronously via event subscription (on publisher thread). - `ImportStatusText` is updated *only* in `ImportBrowseMethod()` (no import operation is triggered by this view model). --- ### 4. **Dependencies** #### **Imports/Usings** - `System.ComponentModel`, `System.ComponentModel.Composition`, `System.Threading.Tasks` - `DTS.Common.Events` (e.g., `RaiseNotification`, `BusyIndicatorChangeNotification`, `ShowStatus`, `StatusInfo`) - `Prism.Events`, `Prism.Regions`, `Prism.Commands` - `Unity` (for `IUnityContainer`) - `DTS.Common.Interface` (e.g., `IDBImportView`, `IDBExportView`, `IDBViewModel`) - `DTS.Common.Utils` (e.g., `FileUtils`) - `DTS.Common.Interactivity` (e.g., `InteractionRequest`) - `System.Text` (for `Encoding`) - `System.Windows.Forms` (for `OpenFileDialog`, `SaveFileDialog`) #### **Consumed Types** - `IDBImportView`, `IDBExportView`, `IDBViewModel` (from `DBImportExport` namespace) - `NotificationContentEventArgs`, `StatusInfo`, `StatusInfo.StatusState` - `FileUtils.DeleteFileOrMove` - `Resources.StringResources` (for UI strings: `ImportFileBrowse_Filter`, `ExportFileBrowse_Filter`, `ExportFileName_Empty`, `ExportFileData_Empty`) #### **Depended Upon By** - Prism-based shell/shell regions (via `IRegionManager`). - Event publishers (e.g., `RaiseNotification`, `BusyIndicatorChangeNotification`). - Views (`IDBImportView`, `IDBExportView`) bound to this view model. --- ### 5. **Gotchas** - **No actual import/export logic**: `ImportData` and `ExportData` are *only* storage properties. No code parses, validates, or processes the XML strings. Import/export is purely file I/O—*no database interaction* occurs in this class. - **`Cleanup()`/`Initialize()` are no-ops**: Lifecycle methods exist for interface compliance but perform no work. - **`IsDirty` is never set**: Always `false`; likely unused or incomplete. - **`IsMenuIncluded`/`IsNavigationIncluded` unused**: Properties exist but have no observed consumers in this file. - **Hardcoded `HeaderInfo`**: Always `"MainRegion"`—no dynamic behavior. - **`LogDummyFunc` does nothing**: Passed to `FileUtils.DeleteFileOrMove` but never logs (silently ignores errors). - **No import operation triggered**: `ImportFileName` is set via browse dialog, but no `Import()` method exists to process the file. - **`Export()` writes directly without user confirmation**: Overwrites existing files silently (only uses `FileUtils.DeleteFileOrMove`). - **`NotificationRequest` conversion quirk**: `OnRaiseNotification` constructs a new `NotificationContentEventArgs` with empty strings for `Image` and `CommandParameter`—may lose data if callers rely on them. - **Thread safety**: `IsBusy` updates occur on `PublisherThread` (via `ThreadOption.PublisherThread`), but other properties lack thread-safety guarantees. > **None identified from source alone** for critical bugs or anti-patterns beyond the above architectural limitations.