---
title: SAIF.Framework.Bindable operations and processes
summary: Business and technical operations supported by this library.
status: draft
owner: SAIF Team
last_reviewed: 2026-07-30
library: SAIF.Framework.Bindable
reference_type: package
---

# SAIF.Framework.Bindable operations and processes

This page is the operation catalog and cross-operation hub for this library. Each operation's detailed, step-by-step logic lives in its own page under `operations/`.

SAIF.Framework.Bindable does not implement business workflows of its own. Instead, it supplies seven reusable notification and `IBindingList` operations that subclasses elsewhere in the SAIF BOF stack invoke (or inherit unchanged) to participate in WinForms/WebForms data binding and rule-violation notification. The seven operations fall into three families: single-object change notification (`clsBindableBase`), collection-level data binding (`clsBindableCollectionBase`), and rule-status notification (`clsRulesManagerBase`). None of them read from or write to a database, call an external service, or delegate into another library's operations — every step executes in-memory within the calling process.

## Operation catalog
| Operation | Intent | Trigger | Inputs | Outputs | Rules | Tables | SQL |
| --- | --- | --- | --- | --- | --- | --- | --- |
| [Notify modified-state change](operations/modified-state-change-notification.md) | Raise `IsModifiedChanged` for the current bindable object instance. | Subclass calls `OnIsModifiedChanged()`. | None. | `IsModifiedChanged(this, EventArgs.Empty)` if a subscriber is attached; otherwise no side effect. | — | — | — |
| [Publish collection-mutation notification](operations/collection-mutation-notification.md) | Translate a completed insert, clear, remove, or set into a `ListChanged` notification. | `CollectionBase` invokes the matching completion hook on a `clsBindableCollectionBase` subclass. | Mutation type plus the affected index/value supplied by the hook. | `ListChangedEventArgs` dispatched to subscribers; otherwise no side effect. | — | — | — |
| [Add a new item through `IBindingList`](operations/binding-list-add-new.md) | Gate `AddNew()` behind the `AllowNew` flag and delegate creation to the `OnAddNew()` extension point. | Caller invokes `IBindingList.AddNew()`. | None. | Object returned by `OnAddNew()`, or `InvalidOperationException` when new items are disallowed. | — | — | — |
| [Find an item through `IBindingList`](operations/binding-list-find.md) | Forward a search request to the subclass's search hook. | Caller invokes `IBindingList.Find(...)`. | `PropertyDescriptor property`, `object key`. | Integer index from `IBindingList_Find(...)`; the unoverridden base hook always returns `-1`. | — | — | — |
| [Apply collection sorting through `IBindingList`](operations/binding-list-apply-sort.md) | Forward a sort request to the subclass's sort hook. | Caller invokes `IBindingList.ApplySort(...)`. | `PropertyDescriptor property`, `ListSortDirection direction`. | Subclass-defined sort side effects; the unoverridden base hook performs no work. | — | — | — |
| [Remove collection sorting through `IBindingList`](operations/binding-list-remove-sort.md) | Forward a sort-removal request to the subclass's reset hook. | Caller invokes `IBindingList.RemoveSort()`. | None. | Subclass-defined sort-reset side effects; the unoverridden base hook performs no work. | — | — | — |
| [Publish rule-status notification](operations/rule-status-notification.md) | Raise the matching rule-status event for a broken or resolved rule. | Subclass calls `OnRuleBroken(rule)` or `OnRuleNotBroken(rule)`. | `object rule`. | `RuleBroken(rule)` or `RuleNotBroken(rule)` when a subscriber is attached; otherwise a `NullReferenceException`. | [BR-001](business-rules.md#br-001-rule-violation-notification-requires-a-subscribed-listener) | — | — |

## Process flow diagram
The following diagram visualizes the primary operational flow across the library's notification and `IBindingList` entry points.

```mermaid
flowchart TD
	Start([Caller or subclass trigger]) --> Trigger{Trigger type}
	Trigger -->|Object state changed| Modified[Notify modified-state change]
	Trigger -->|Collection mutation completed| Mutation[Publish collection-mutation notification]
	Trigger -->|Binding list AddNew| AddNew[Add a new item through IBindingList]
	Trigger -->|Binding list Find| Find[Find an item through IBindingList]
	Trigger -->|Binding list ApplySort| Sort[Apply collection sorting through IBindingList]
	Trigger -->|Binding list RemoveSort| RemoveSort[Remove collection sorting through IBindingList]
	Trigger -->|Rule status changed| Rule[Publish rule-status notification]
	Modified --> End([Return to caller])
	Mutation --> End
	AddNew --> End
	Find --> End
	Sort --> End
	RemoveSort --> End
	Rule --> End
```

## Failure and edge-case behavior
- `IBindingList.AddNew()` throws `InvalidOperationException("Allow New Not Supported for this object")` whenever `AllowNew` is `false` at the time of the call.
- `IBindingList.Find(...)` always returns `-1` unless a subclass overrides `IBindingList_Find(...)` with real search logic — the base class reports "not found" for every lookup.
- `IBindingList.ApplySort(...)` and `RemoveSort()` return successfully without changing collection order or sort state unless a subclass overrides the corresponding protected hook; callers cannot detect from the return value alone whether sorting actually occurred.
- `OnRuleBroken(rule)` and `OnRuleNotBroken(rule)` throw `NullReferenceException` whenever their corresponding event has no subscriber, because both methods invoke the delegate directly without a null check; see [BR-001](business-rules.md#br-001-rule-violation-notification-requires-a-subscribed-listener).

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Business rules](business-rules.md)
- [Configuration](configuration.md)
- [API reference](api/index.md)

## Sources
- `SAIF.Framework.Bindable\clsBindableBase.cs`
- `SAIF.Framework.Bindable\clsBindableCollectionBase.cs`
- `SAIF.Framework.Bindable\clsrulesmanagerbase.cs`
