110 lines
6.9 KiB
Markdown
110 lines
6.9 KiB
Markdown
---
|
||
source_files:
|
||
- DataPRO/Modules/Realtime/RealtimeModule/ViewModel/RealtimeChannelSelectViewModel.cs
|
||
generated_at: "2026-04-16T04:47:50.422558+00:00"
|
||
model: "Qwen/Qwen3-Coder-Next-FP8"
|
||
schema_version: 1
|
||
sha256: "3c94987e004e61ba"
|
||
---
|
||
|
||
# ViewModel
|
||
|
||
## Documentation: `RealtimeChannelSelectViewModel`
|
||
|
||
---
|
||
|
||
### 1. **Purpose**
|
||
|
||
`RealtimeChannelSelectViewModel` is a Prism-based ViewModel responsible for managing the UI state and logic of the Realtime Channel Selection view. It exposes a list of available real-time channels, supports filtering them by user-provided search text, and publishes selection events when a channel is chosen. It integrates with the application’s event system via `IEventAggregator` to coordinate with other modules (e.g., signaling busy state, displaying notifications, and publishing channel selections). It does not implement complex business logic itself but serves as a thin presentation layer adapter between the view and the underlying event-driven architecture.
|
||
|
||
---
|
||
|
||
### 2. **Public Interface**
|
||
|
||
- **`IRealtimeChannelSelectView ChannelSelectView { get; set; }`**
|
||
Reference to the associated view (`IRealtimeChannelSelectView`). Set during construction and used to bind `DataContext`.
|
||
|
||
- **`InteractionRequest<Notification> NotificationRequest { get; }`**
|
||
Prism `InteractionRequest` used to trigger notification popups (e.g., alerts, messages). Raised via `OnRaiseNotification`.
|
||
|
||
- **`InteractionRequest<Confirmation> ConfirmationRequest { get; }`**
|
||
Prism `InteractionRequest` for confirmation dialogs (currently unused in the provided code).
|
||
|
||
- **`event PropertyChangedEventHandler PropertyChanged`**
|
||
Standard `INotifyPropertyChanged` implementation. Used to notify UI of property changes.
|
||
|
||
- **`void OnPropertyChanged(string propertyName)`**
|
||
Helper to raise `PropertyChanged` event for a given property.
|
||
|
||
- **`void SetAvailableChannels(IRealtimeChannel[] channels)`**
|
||
Sets the full, unfiltered list of channels. Triggers filtering and updates `RealtimeChannels`.
|
||
|
||
- **`void SetSearchText(string searchText)`**
|
||
Updates the internal search term and re-applies filtering. Channels whose `ToString()` representation contains the search term (case-insensitive, culture-sensitive) are included.
|
||
|
||
- **`void SetRealtimeChannel(IRealtimeChannel channel)`**
|
||
Publishes the selected channel via the `RealtimeChannelSelectedEvent` event.
|
||
|
||
- **`void Unset()`, `void Cleanup()`, `Task CleanupAsync()`, `void Initialize()`, `void Initialize(object)`, `void Initialize(object, object)`, `Task InitializeAsync()`, `Task InitializeAsync(object)`, `void Activated()`**
|
||
Lifecycle stubs required by Prism’s `INavigationAware`, `IInitializeAsync`, etc. interfaces. All are currently empty and have no effect.
|
||
|
||
- **`bool IsBusy { get; set; }`**
|
||
Bindable property indicating whether the UI should show a busy indicator. Set via subscription to `BusyIndicatorChangeNotification`.
|
||
|
||
- **`bool IsMenuIncluded { get; set; }`**
|
||
Bindable property indicating whether the menu UI section should be visible.
|
||
|
||
- **`bool IsNavigationIncluded { get; set; }`**
|
||
Bindable property indicating whether the navigation UI section should be visible.
|
||
|
||
- **`IRealtimeChannel[] RealtimeChannels { get; set; }`**
|
||
Bindable array of filtered channels to display in the view. Initialized to an empty array.
|
||
|
||
- **`bool IsDirty => false`**
|
||
Always returns `false`. Indicates no unsaved changes (not implemented).
|
||
|
||
---
|
||
|
||
### 3. **Invariants**
|
||
|
||
- `RealtimeChannels` always reflects the current filtered view of `_allChannels` after `SetAvailableChannels` or `SetSearchText` is called.
|
||
- `_searchTerm` is used case-insensitively (via `CultureInfo.CurrentCulture.CompareInfo`) to filter channels by their `ToString()` representation.
|
||
- `IsBusy` is updated synchronously on the publisher thread (due to `ThreadOption.PublisherThread` in subscription).
|
||
- `_allChannels` is never `null` after `SetAvailableChannels` is called (though it may be an empty array).
|
||
- `RealtimeChannelSelectedEvent` is published *only* when `SetRealtimeChannel` is invoked.
|
||
- `NotificationRequest` is always raised with a `Notification` object containing a `NotificationContentEventArgs` (with empty `Footer` and `FooterCommand` fields) and the original title.
|
||
|
||
---
|
||
|
||
### 4. **Dependencies**
|
||
|
||
**Imports / Dependencies (from source):**
|
||
- `DTS.Common.Events`, `DTS.Common.Events.Realtime`, `DTS.Common.Interactivity`, `DTS.Common.Interface.Realtime`
|
||
→ Defines core event types (`RaiseNotification`, `BusyIndicatorChangeNotification`, `RealtimeChannelSelectedEvent`) and interfaces (`IRealtimeChannel`, `IRealtimeChannelSelectView`, `IRealtimeChannelSelectViewModel`).
|
||
- `Prism.Events`, `Prism.Regions`, `Unity`
|
||
→ Prism framework for event aggregation, region management, and Unity DI container.
|
||
- `System.ComponentModel`, `System.Linq`, `System.Threading.Tasks`
|
||
→ Standard .NET types for INPC, LINQ, async.
|
||
|
||
**Consumers (inferred):**
|
||
- Any module/component that needs to display notifications via `RaiseNotification` or control busy state via `BusyIndicatorChangeNotification`.
|
||
- Any module that needs to respond to channel selection via `RealtimeChannelSelectedEvent`.
|
||
- The view (`IRealtimeChannelSelectView`) binds to `RealtimeChannels`, `IsBusy`, `IsMenuIncluded`, `IsNavigationIncluded`, and commands (none defined here).
|
||
|
||
**Dependencies on this module:**
|
||
- The view (`IRealtimeChannelSelectView`) depends on this ViewModel for data binding.
|
||
- Other modules subscribe to `RealtimeChannelSelectedEvent` to react to user selections.
|
||
|
||
---
|
||
|
||
### 5. **Gotchas**
|
||
|
||
- **`ToString()`-based filtering**: Filtering relies on `channel.ToString()`, which may be implementation-specific (e.g., default type name or overridden). Ensure `IRealtimeChannel` implementations provide meaningful `ToString()` output for search to work as intended.
|
||
- **Empty lifecycle methods**: All Prism lifecycle methods (`Initialize`, `Cleanup`, etc.) are no-ops. If initialization/cleanup logic is needed, it must be added.
|
||
- **`IsDirty` always `false`**: The `IsDirty` property is hardcoded to `false`. If dirty-state tracking is required, it is not implemented here.
|
||
- **Culture-specific search**: Search uses `CultureInfo.CurrentCulture`. Behavior may vary across locales (e.g., Turkish i problem). Consider `CultureInfo.InvariantCulture` if consistent behavior across locales is required.
|
||
- **Thread safety**: `_allChannels` and `_searchTerm` are not thread-safe. `Filter()` is called synchronously from `SetAvailableChannels`/`SetSearchText`, but if those are invoked from non-UI threads, race conditions may occur (though unlikely given Prism conventions).
|
||
- **Unused `ConfirmationRequest`**: The `ConfirmationRequest` is declared but never used—potential tech debt or placeholder.
|
||
- **No command bindings**: The `#region Commands` section is empty. UI interaction (e.g., channel selection) likely occurs via direct method calls from the view (e.g., `SetRealtimeChannel`), not Prism `ICommand` bindings.
|
||
|
||
None identified beyond the above. |