--- source_files: - Common/DTS.CommonCore/Events/RegionOfInterest/RegionOfInterestChannels/RegionOfInterestChannelsSelectedEvent.cs generated_at: "2026-04-16T02:48:50.089661+00:00" model: "Qwen/Qwen3-Coder-Next-FP8" schema_version: 1 sha256: "ab9ac5458ba58e80" --- # RegionOfInterestChannels ### 1. Purpose This module defines event types used for broadcasting and subscribing to selections of channels within a specific Region of Interest (ROI) in a Prism-based application. Specifically, it enables decoupled communication where a consumer (e.g., a view model or service) signals that a set of channels has been selected for a given ROI, identified by a suffix. The event is published using Prism’s `CompositePresentationEvent`, supporting both synchronous and asynchronous subscription patterns across modules or layers. ### 2. Public Interface - **`RegionOfInterestChannelsSelectedEvent`** *Type:* `class` (inherits from `CompositePresentationEvent`) *Behavior:* A Prism event used to publish and subscribe to ROI channel selection changes. Subscribers receive an instance of `RegionOfInterestChannelsSelectedEventArgs` containing the selected channels and metadata. - **`RegionOfInterestChannelsSelectedEventArgs`** *Type:* `class` *Behavior:* Encapsulates the data payload for the `RegionOfInterestChannelsSelectedEvent`. - **Constructor:** ```csharp RegionOfInterestChannelsSelectedEventArgs(string roiSuffix, string[] selectedChannelNames, object o) ``` Initializes the event args with: - `roiSuffix`: A string identifying the ROI (e.g., `"Brain"`, `"Lesion"`), used to scope the channel selection. - `selectedChannelNames`: An array of channel names (e.g., `["Red", "Green"]`) selected for the ROI. - `o`: The consumer object triggering the event (e.g., a view model instance). - **Properties:** - `RegionOfInterestSuffix`: `string` — read-only; identifies the ROI context. - `ChannelNames`: `string[]` — read-only; the list of selected channel names. - `Consumer`: `object` — read-only; the object responsible for raising the event. ### 3. Invariants - `RegionOfInterestSuffix` and `ChannelNames` are non-null (enforced by constructor; no null checks are present in the source, implying callers must supply valid values). - `ChannelNames` is expected to be a non-empty array in typical usage (though not enforced by this class—consumers must validate). - The `Consumer` property is non-null in practice (as it is passed directly from the constructor argument `o`), but the class does not enforce this. - The event is *publish-only*—no built-in mechanism for acknowledgment or cancellation. ### 4. Dependencies - **Depends on:** - `Microsoft.Practices.Prism.Events` (for `CompositePresentationEvent`) - `Microsoft.Practices.Prism.Regions` (imported but *not used* in this file—likely a legacy or placeholder import) - `System` (implicitly via `string`, `object`, `string[]`) - **Used by:** - Other modules in the `DTS.Common.Events.RegionOfInterest.RegionOfInterestChannels` namespace (inferred from namespace structure). - Any Prism module that needs to publish or subscribe to ROI channel selection events (e.g., UI components, analysis services). ### 5. Gotchas - **No validation in constructor:** The class does not validate `roiSuffix`, `selectedChannelNames`, or `o` for null or emptiness, risking `NullReferenceException` or invalid state at runtime if callers are not disciplined. - **`Prism.Regions` import is unused:** The `using Microsoft.Practices.Prism.Regions;` statement is present but irrelevant—suggests possible copy-paste artifact or incomplete refactoring. - **`Consumer` is untyped:** Using `object` for `Consumer` makes it unclear what contract the consumer is expected to adhere to (e.g., interface requirements), increasing coupling risk. - **No immutability guarantee for `ChannelNames`:** While the property is read-only, the underlying array reference is mutable—subscribers could observe side effects if the caller retains and mutates the array after construction. - **No documentation on ROI suffix semantics:** The meaning of `RegionOfInterestSuffix` (e.g., allowed values, naming conventions) is not defined here—consumers must infer from context or external documentation.