# rubberduck-vba/mvvm architecture

> Architecture diagram of the GitHub repository rubberduck-vba/mvvm, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/rubberduck-vba/mvvm
- Repository: https://github.com/rubberduck-vba/mvvm

## Overview

This repository is an educational VBA MVVM framework for Excel user interfaces. Its main workflow connects a ViewModel to UI controls through an application context and binding managers, then handles user input, commands, and validation. The README also documents runtime-generated views. Relationships below follow the README; source excerpts were unavailable, so implementation-level wiring beyond those documented relationships is omitted.

Main entry points: [`src/BindingManager.cls`](https://github.com/rubberduck-vba/mvvm/blob/main/src/BindingManager.cls) (Binding Manager), [`src/PropertyBindingBase.cls`](https://github.com/rubberduck-vba/mvvm/blob/main/src/PropertyBindingBase.cls) (Property Binding), [`src/ExampleView.frm`](https://github.com/rubberduck-vba/mvvm/blob/main/src/ExampleView.frm) (View / Controls), [`src/CommandManager.cls`](https://github.com/rubberduck-vba/mvvm/blob/main/src/CommandManager.cls) (Command Manager)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_core["Application Core"]
  node_view["View / Controls<br/>[ExampleView.frm]"]
  node_viewmodel["ViewModel"]
  node_context["App Context<br/>[AppContext.cls]"]
end

subgraph group_binding["Property Binding"]
  node_bindings["Binding Manager<br/>[BindingManager.cls]"]
  node_bindingpath["Binding Path<br/>[BindingPath.cls]"]
  node_propertybinding["Property Binding"]
  node_notifier["Property Notifier"]
end

subgraph group_commands["Command Binding"]
  node_commandmanager["Command Manager<br/>[CommandManager.cls]"]
  node_command["Command<br/>[AcceptCommand.cls]"]
end

subgraph group_validation["Validation"]
  node_validationmanager["Validation Manager"]
  node_validator["Value Validator"]
  node_validationerror["Validation Errors"]
  node_adorner["Error Adorner"]
end

subgraph group_dynamic["Dynamic UI"]
  node_dynamiccontrols["Dynamic Controls"]
  node_layout["Container Layout"]
  node_dynamicview["Dynamic View"]
end

node_user(("User"))

node_user -->|"uses"| node_view
node_context -->|"exposes"| node_bindings
node_context -->|"exposes"| node_commandmanager
node_context -->|"exposes"| node_validationmanager
node_view -->|"binds properties"| node_bindings
node_bindings -->|"resolves paths"| node_bindingpath
node_bindings -->|"creates bindings"| node_propertybinding
node_propertybinding -->|"reads and writes"| node_viewmodel
node_viewmodel -->|"notifies changes"| node_notifier
node_notifier -->|"signals changes"| node_propertybinding
node_view -->|"binds command"| node_commandmanager
node_commandmanager -->|"invokes"| node_command
node_commandmanager -->|"enables control"| node_view
node_propertybinding -->|"validates value"| node_validator
node_propertybinding -->|"reports errors"| node_validationmanager
node_validationmanager -->|"tracks errors"| node_validationerror
node_validationmanager -->|"shows cues"| node_adorner
node_dynamicview -->|"generates controls"| node_dynamiccontrols
node_dynamiccontrols -->|"uses layout"| node_layout
node_dynamiccontrols -->|"creates bindings"| node_bindings
node_dynamicview -->|"applies bindings"| node_bindings

click node_view "https://github.com/rubberduck-vba/mvvm/blob/main/src/ExampleView.frm"
click node_viewmodel "https://github.com/rubberduck-vba/mvvm/blob/main/src/ExampleViewModel.cls"
click node_context "https://github.com/rubberduck-vba/mvvm/blob/main/src/AppContext.cls"
click node_bindings "https://github.com/rubberduck-vba/mvvm/blob/main/src/BindingManager.cls"
click node_bindingpath "https://github.com/rubberduck-vba/mvvm/blob/main/src/BindingPath.cls"
click node_propertybinding "https://github.com/rubberduck-vba/mvvm/blob/main/src/PropertyBindingBase.cls"
click node_notifier "https://github.com/rubberduck-vba/mvvm/blob/main/src/PropertyChangeNotifierBase.cls"
click node_commandmanager "https://github.com/rubberduck-vba/mvvm/blob/main/src/CommandManager.cls"
click node_command "https://github.com/rubberduck-vba/mvvm/blob/main/src/AcceptCommand.cls"
click node_validationmanager "https://github.com/rubberduck-vba/mvvm/blob/main/src/ValidationManager.cls"
click node_validator "https://github.com/rubberduck-vba/mvvm/blob/main/src/RequiredStringValidator.cls"
click node_validationerror "https://github.com/rubberduck-vba/mvvm/blob/main/src/ValidationErrors.cls"
click node_adorner "https://github.com/rubberduck-vba/mvvm/blob/main/src/DefaultErrorAdornerFactory.cls"
click node_dynamiccontrols "https://github.com/rubberduck-vba/mvvm/blob/main/src/DynamicControls.cls"
click node_layout "https://github.com/rubberduck-vba/mvvm/blob/main/src/ContainerLayout.cls"
click node_dynamicview "https://github.com/rubberduck-vba/mvvm/blob/main/src/ExampleDynamicView.frm"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_view,node_viewmodel,node_context,node_user toneBlue
class node_bindings,node_bindingpath,node_propertybinding,node_notifier toneAmber
class node_commandmanager,node_command toneMint
class node_validationmanager,node_validator,node_validationerror,node_adorner toneRose
class node_dynamiccontrols,node_layout,node_dynamicview toneIndigo
```

## Components

### Application Core

- [View / Controls](https://github.com/rubberduck-vba/mvvm/blob/main/src/ExampleView.frm): `src/ExampleView.frm`
- [ViewModel](https://github.com/rubberduck-vba/mvvm/blob/main/src/ExampleViewModel.cls): `src/ExampleViewModel.cls`
- [App Context](https://github.com/rubberduck-vba/mvvm/blob/main/src/AppContext.cls): `src/AppContext.cls`

### Property Binding

- [Binding Manager](https://github.com/rubberduck-vba/mvvm/blob/main/src/BindingManager.cls): `src/BindingManager.cls`
- [Binding Path](https://github.com/rubberduck-vba/mvvm/blob/main/src/BindingPath.cls): `src/BindingPath.cls`
- [Property Binding](https://github.com/rubberduck-vba/mvvm/blob/main/src/PropertyBindingBase.cls): `src/PropertyBindingBase.cls`
- [Property Notifier](https://github.com/rubberduck-vba/mvvm/blob/main/src/PropertyChangeNotifierBase.cls): `src/PropertyChangeNotifierBase.cls`

### Command Binding

- [Command Manager](https://github.com/rubberduck-vba/mvvm/blob/main/src/CommandManager.cls): `src/CommandManager.cls`
- [Command](https://github.com/rubberduck-vba/mvvm/blob/main/src/AcceptCommand.cls): `src/AcceptCommand.cls`

### Validation

- [Validation Manager](https://github.com/rubberduck-vba/mvvm/blob/main/src/ValidationManager.cls): `src/ValidationManager.cls`
- [Value Validator](https://github.com/rubberduck-vba/mvvm/blob/main/src/RequiredStringValidator.cls): `src/RequiredStringValidator.cls`
- [Validation Errors](https://github.com/rubberduck-vba/mvvm/blob/main/src/ValidationErrors.cls): `src/ValidationErrors.cls`
- [Error Adorner](https://github.com/rubberduck-vba/mvvm/blob/main/src/DefaultErrorAdornerFactory.cls): `src/DefaultErrorAdornerFactory.cls`

### Dynamic UI

- [Dynamic Controls](https://github.com/rubberduck-vba/mvvm/blob/main/src/DynamicControls.cls): `src/DynamicControls.cls`
- [Container Layout](https://github.com/rubberduck-vba/mvvm/blob/main/src/ContainerLayout.cls): `src/ContainerLayout.cls`
- [Dynamic View](https://github.com/rubberduck-vba/mvvm/blob/main/src/ExampleDynamicView.frm): `src/ExampleDynamicView.frm`

### Other components

- **User**

## Connections

- User → View / Controls: uses
- App Context → Binding Manager: exposes
- App Context → Command Manager: exposes
- App Context → Validation Manager: exposes
- View / Controls → Binding Manager: binds properties
- Binding Manager → Binding Path: resolves paths
- Binding Manager → Property Binding: creates bindings
- Property Binding → ViewModel: reads and writes
- ViewModel → Property Notifier: notifies changes
- Property Notifier → Property Binding: signals changes
- View / Controls → Command Manager: binds command
- Command Manager → Command: invokes
- Command Manager → View / Controls: enables control
- Property Binding → Value Validator: validates value
- Property Binding → Validation Manager: reports errors
- Validation Manager → Validation Errors: tracks errors
- Validation Manager → Error Adorner: shows cues
- Dynamic View → Dynamic Controls: generates controls
- Dynamic Controls → Container Layout: uses layout
- Dynamic Controls → Binding Manager: creates bindings
- Dynamic View → Binding Manager: applies bindings
