---
title: SAIF.Presentation.Web.Binding.Infragistics111 business rules
summary: Enumerated business rules with per-rule trigger, enforcement, and outcomes.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-08-17
library: SAIF.Presentation.Web.Binding.Infragistics111
reference_type: package
---

# SAIF.Presentation.Web.Binding.Infragistics111 business rules

This page captures business rules enforced by this library. All local rules are read from `SAIF.Presentation.Web.Binding.Infragistics111` source; each row's **Source** is the file that defines the enforcement point.

## BR-BIND-001: Binder selected by overload resolution

| Field | Value |
| --- | --- |
| **Statement** | Every supported control type has exactly one binder implementation, selected by `Add` overload resolution. |
| **Trigger** | `Add` call |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | The correct control property is read/written for each control type. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-002: BindSource sets validation source

| Field | Value |
| --- | --- |
| **Statement** | Setting a binder's `BindSource` also sets its validation source unless dual binding overrides it. |
| **Trigger** | `BindSource` setter |
| **Enforcement** | Each binder's `BindSource` property |
| **Outcome** | Validation defaults to the bound object. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb |

---

## BR-BIND-003: UseEvents defaults to enabled

| Field | Value |
| --- | --- |
| **Statement** | Event-driven binding defaults to on (`UseEvents = True`) and can be disabled per binding. |
| **Trigger** | `Add` overloads with an `inUseEvents` argument |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | Applications can choose immediate vs. batched write-back. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-004: Validation object registered once by key

| Field | Value |
| --- | --- |
| **Statement** | Each distinct validation object is registered once, keyed by its `MyGuid` for SAIF framework objects or its type name otherwise. |
| **Trigger** | `AddBinder` |
| **Enforcement** | `clsObjectBinderbase.vb` (`ValidationKey`), `clsObjectBindManager.vb` (`AddBinder`) |
| **Outcome** | A business object is validated once no matter how many controls bind to it. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb, SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-005: Empty validation key skips registration

| Field | Value |
| --- | --- |
| **Statement** | A binder whose validation object is `Nothing` produces an empty key and is not registered for source validation. |
| **Trigger** | `AddBinder` with an empty key |
| **Enforcement** | `clsObjectBindManager.vb` (`AddBinder`) |
| **Outcome** | Unbound binders do not break the validation pass. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-006: AutoBind persists via ViewState

| Field | Value |
| --- | --- |
| **Statement** | The `AutoBind` setting survives postbacks via `ViewState`. |
| **Trigger** | `OnLoad` / `OnPreRender` |
| **Enforcement** | `clsObjectBindManager.vb` (`LoadStateValues`, `SaveStateValues`) |
| **Outcome** | Auto-bind behavior is stable across the page lifecycle. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-007: Change event subscription requires UseEvents

| Field | Value |
| --- | --- |
| **Statement** | A binder subscribes to its control's change event only when `UseEvents` is `True`. |
| **Trigger** | `Init` |
| **Enforcement** | Each binder's `Init` |
| **Outcome** | Applications that batch their writes are not surprised by mid-request object mutation. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb |

---

## BR-BIND-008: Change event subscription requires write-back bind type

| Field | Value |
| --- | --- |
| **Statement** | Change-event subscription happens only for `ControlToObject` and `TwoWay` bindings. |
| **Trigger** | `Init` |
| **Enforcement** | Each binder's `Init` |
| **Outcome** | Display-only bindings never write back. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb |

---

## BR-BIND-009: Custom validator forced to ValidateOnly

| Field | Value |
| --- | --- |
| **Statement** | A custom validator is always forced to `ValidateOnly`, regardless of the bind type requested. |
| **Trigger** | `clsCustomValidator.Init` |
| **Enforcement** | `clsCustomValidator.vb` |
| **Outcome** | Custom validators never move data. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsCustomValidator.vb |

---

## BR-BIND-010: DataBind and BindToObject respect bind type

| Field | Value |
| --- | --- |
| **Statement** | `DataBind` processes only `ObjectToControl`/`TwoWay` binders; `BindToObject` processes only `ControlToObject`/`TwoWay` binders. |
| **Trigger** | `DataBind`, `BindToObject` |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | One-way bindings stay one-way. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-011: Nothing bind source skips data movement

| Field | Value |
| --- | --- |
| **Statement** | A `Nothing` bind source causes the binder to skip data movement silently. |
| **Trigger** | `ObjectToControl` |
| **Enforcement** | Each binder's `ObjectToControl` |
| **Outcome** | Pages render without error before their objects are loaded. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb |

---

## BR-BIND-012: Object values read via TypeConverter

| Field | Value |
| --- | --- |
| **Statement** | Object values are read through `TypeDescriptor` / `PropertyDescriptor` and the property's `TypeConverter`, and a value that cannot be converted yields `Nothing`. |
| **Trigger** | `GetObjectValueAsString` |
| **Enforcement** | `clsObjectBinderbase.vb` |
| **Outcome** | Formatting follows the property's own type converter. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb |

---

## BR-BIND-013: Padding applied before display

| Field | Value |
| --- | --- |
| **Statement** | When padding is configured for the control target, the value is left- or right-padded to the configured length with the configured character before display. |
| **Trigger** | `GetObjectValueAsString` with `UsePadding` |
| **Enforcement** | `clsObjectBinderbase.vb` |
| **Outcome** | Fixed-width legacy fields display correctly. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb |

---

## BR-BIND-014: Numeric editors write configured value property

| Field | Value |
| --- | --- |
| **Statement** | Numeric editors write to the specific Infragistics value property named by `NumericControlProperty`. |
| **Trigger** | `ObjectToControl` / `ControlToObject` on a numeric binder |
| **Enforcement** | `clsWebNumericEditBinder.vb`, `clsWebNumericEditorBinder.vb` |
| **Outcome** | Numeric precision/type is preserved end to end. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsWebNumericEditBinder.vb, SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsControls/clsWebNumericEditorBinder.vb |

---

## BR-BIND-015: Null nullable decimal displays as NaN

| Field | Value |
| --- | --- |
| **Statement** | A `NullableDecimal` target whose object value is `Nothing` displays as `Double.NaN` (an empty editor). |
| **Trigger** | `ObjectToControl` on a numeric binder |
| **Enforcement** | `clsWebNumericEditBinder.vb` |
| **Outcome** | Null numerics render blank rather than zero. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsWebNumericEditBinder.vb |

---

## BR-BIND-016: Check box maps boolean or string flag

| Field | Value |
| --- | --- |
| **Statement** | A check box maps to a `Boolean` property directly, or to a `String` property using the configured checked/unchecked strings compared case-insensitively. |
| **Trigger** | `ObjectToControl` / `ControlToObject` on `clsCheckBoxBinder` |
| **Enforcement** | `clsCheckBoxBinder.vb` |
| **Outcome** | Legacy Y/N-style string flags bind to check boxes. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/ASPControls/clsCheckBoxBinder.vb |

---

## BR-BIND-017: Grid binding uses native DataBind

| Field | Value |
| --- | --- |
| **Statement** | Grid binding assigns the collection to the grid's `DataSource` and calls the grid's own `DataBind`. |
| **Trigger** | `ObjectToControl` on a grid binder |
| **Enforcement** | `clsUltraGridBinder.vb`, `clsWebDataGridBinder.vb` |
| **Outcome** | Grids use native Infragistics binding. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsUltraGridBinder.vb, SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsControls/clsWebDataGridBinder.vb |

---

## BR-BIND-018: AutoBind triggers on PreRender

| Field | Value |
| --- | --- |
| **Statement** | When `AutoBind` is `True`, object-to-control binding runs automatically on `PreRender`. |
| **Trigger** | `OnPreRender` |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | Pages need not call `DataBind()` explicitly. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-019: BindToObject respects inAllControls flag

| Field | Value |
| --- | --- |
| **Statement** | `BindToObject()` without arguments writes back only the bindings that do **not** use events; `BindToObject(True)` writes back all bindings. |
| **Trigger** | `BindToObject` |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | Event-driven bindings are not written twice. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-020: String target receives text verbatim

| Field | Value |
| --- | --- |
| **Statement** | A `String` target property receives the control's text verbatim. |
| **Trigger** | `ControlToObject` on a text binder |
| **Enforcement** | `clsTextBoxBinder.vb` |
| **Outcome** | No implicit conversion for string fields. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/ASPControls/clsTextBoxBinder.vb |

---

## BR-BIND-021: Non-string target uses Convert.ChangeType

| Field | Value |
| --- | --- |
| **Statement** | A non-`String` target property is set via `Convert.ChangeType`, and a conversion failure leaves the property unchanged without raising an error. |
| **Trigger** | `ControlToObject` on a text binder |
| **Enforcement** | `clsTextBoxBinder.vb` |
| **Outcome** | Bad input does not crash the page; the stale value survives and is caught by validation.* |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/ASPControls/clsTextBoxBinder.vb |

---

## BR-BIND-022: Empty numeric text stores null

| Field | Value |
| --- | --- |
| **Statement** | A `NullableDecimal` target receives an empty nullable when the editor text is empty. |
| **Trigger** | `ControlToObject` on a numeric binder |
| **Enforcement** | `clsWebNumericEditBinder.vb` |
| **Outcome** | Blank numeric input stores `NULL` rather than zero. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsWebNumericEditBinder.vb |

---

## BR-BIND-023: String target on numeric editor receives Text

| Field | Value |
| --- | --- |
| **Statement** | A `String` target on a numeric editor receives the editor's `Text`, not its typed value. |
| **Trigger** | `ControlToObject` on a numeric binder |
| **Enforcement** | `clsWebNumericEditBinder.vb` |
| **Outcome** | Formatted numeric strings round-trip. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsWebNumericEditBinder.vb |

---

## BR-BIND-024: Grid row matched by key property

| Field | Value |
| --- | --- |
| **Statement** | Grid write-back matches a grid row to a business object by comparing the key property's value with the key cell's value as strings. |
| **Trigger** | `ControlToObject` on a grid binder |
| **Enforcement** | `clsUltraGridBinder.vb` (`UpdateObjectProperties`) |
| **Outcome** | The right row updates the right object. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsUltraGridBinder.vb |

---

## BR-BIND-025: Hierarchical grid write-back recurses child bands

| Field | Value |
| --- | --- |
| **Statement** | Hierarchical grid write-back recurses into child rows, resolving each band's child collection by `Band.BaseTableName` and each band's key by `HierarchialGridArgs`. |
| **Trigger** | `ControlToObject` on a hierarchical binding |
| **Enforcement** | `clsUltraGridBinder.vb`, `clsWebHierarchicalDataGridBinder.vb` |
| **Outcome** | Parent/child edits both persist to the object graph. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsUltraGridBinder.vb, SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsControls/clsWebHierarchicalDataGridBinder.vb |

---

## BR-BIND-026: UseEvents writes back immediately on change

| Field | Value |
| --- | --- |
| **Statement** | With `UseEvents` enabled, the object is updated immediately when the control raises its change event. |
| **Trigger** | Control change event |
| **Enforcement** | Each binder's change handler |
| **Outcome** | Dependent server-side logic sees fresh values within the same postback. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb |

---

## BR-BIND-027: Validation writes back before checking

| Field | Value |
| --- | --- |
| **Statement** | Validation always writes control values back to the objects first. |
| **Trigger** | `Validate`, `RefreshValidation` |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | Nothing is validated against stale object state. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-028: Validation clears prior error state

| Field | Value |
| --- | --- |
| **Statement** | Each validation pass clears the previous error list and the first-error-control reference. |
| **Trigger** | `Validate`, `RefreshValidation` |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | Errors do not accumulate across postbacks. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-029: Reading IsValid triggers rule evaluation

| Field | Value |
| --- | --- |
| **Statement** | `Validate()` reads each registered validation object's `IsValid` property, which triggers the business object's own rule evaluation. |
| **Trigger** | `ValidateBindSources` |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | Business rules run before their messages are harvested. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-030: Custom validators run delegate; others harvest IDataErrorInfo

| Field | Value |
| --- | --- |
| **Statement** | Custom validators run their delegate; all other binders harvest errors from `IDataErrorInfo`. |
| **Trigger** | `Validate`, `RefreshValidation` |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | Both validation styles feed one error pipeline. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-031: Dual binder validates its validation pair

| Field | Value |
| --- | --- |
| **Statement** | A dual binder harvests errors from its validation object/property; every other binder uses its bind object/property. |
| **Trigger** | `GetErrors` |
| **Enforcement** | `clsObjectBinderbase.vb` |
| **Outcome** | Display object and validated object can differ. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb |

---

## BR-BIND-032: Error text split and BR stripped

| Field | Value |
| --- | --- |
| **Statement** | Multi-line error text is split on CRLF, `<BR>` markup is stripped, and blank fragments are discarded. |
| **Trigger** | `GetErrors`, grid validation |
| **Enforcement** | `clsObjectBinderbase.vb`, `clsUltraGridBinder.vb` |
| **Outcome** | Each rule violation becomes one clean message. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb, SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsUltraGridBinder.vb |

---

## BR-BIND-033: Non-empty error text flags control

| Field | Value |
| --- | --- |
| **Statement** | A control with non-empty error text is marked as containing an error. |
| **Trigger** | `GetErrors` |
| **Enforcement** | `clsObjectBinderbase.vb` |
| **Outcome** | Error styling and the overall result follow the message. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb |

---

## BR-BIND-034: Duplicate messages reported once

| Field | Value |
| --- | --- |
| **Statement** | Duplicate error messages are reported only once per validation pass. |
| **Trigger** | `Validate`, `RefreshValidation` |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | Users do not see the same message repeated for every bound control. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-035: First error control recorded

| Field | Value |
| --- | --- |
| **Statement** | The first control found with an error is recorded so the page can focus it. |
| **Trigger** | `Validate`, `RefreshValidation` |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | The user is taken to the first problem field. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-036: Clean binder preserves first error control formatting

| Field | Value |
| --- | --- |
| **Statement** | A clean binder does not reset the formatting of a control that another binder already flagged as the first error control. |
| **Trigger** | `Validate`, `RefreshValidation` |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | Error highlighting survives multiple bindings on one control. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-037: Error styling by control type

| Field | Value |
| --- | --- |
| **Statement** | Error styling is `errorbordercolor` for multiline text boxes and check boxes, `errorbackcolor` for all other controls. |
| **Trigger** | `SetControlFormat(False)` |
| **Enforcement** | `clsObjectBinderbase.vb` |
| **Outcome** | Error indication is visible on controls whose background cannot be tinted. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb |

---

## BR-BIND-038: Grids never styled at control level

| Field | Value |
| --- | --- |
| **Statement** | `UltraWebGrid` and `WebDataGrid` controls are never given error or valid CSS classes at the control level. |
| **Trigger** | `SetControlFormat` |
| **Enforcement** | `clsObjectBinderbase.vb` |
| **Outcome** | Grid errors are shown per cell, not per grid. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb |

---

## BR-BIND-039: Disabled controls not restyled on success

| Field | Value |
| --- | --- |
| **Statement** | A control already styled `disabledbackcolor` (protected/read-only) is never restyled on a successful validation. |
| **Trigger** | `SetControlFormat(True)` |
| **Enforcement** | `clsObjectBinderbase.vb` |
| **Outcome** | Protected fields keep their disabled appearance. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb |

---

## BR-BIND-040: Valid styling by control type

| Field | Value |
| --- | --- |
| **Statement** | Valid styling is `normal` for labels, an empty class for check boxes, and `defaultbackcolor` for everything else. |
| **Trigger** | `SetControlFormat(True)` |
| **Enforcement** | `clsObjectBinderbase.vb` |
| **Outcome** | Consistent post-validation appearance. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb |

---

## BR-BIND-041: Distinct messages joined with BR

| Field | Value |
| --- | --- |
| **Statement** | All distinct error messages are concatenated with `<BR>` separators. |
| **Trigger** | `FormattedErrorMessage` |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | One HTML block lists every problem. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-042: Formatted message written to configured controls

| Field | Value |
| --- | --- |
| **Statement** | The formatted message is written to `ErrorLabel` and/or `SAIFMessage` only when those properties are set. |
| **Trigger** | End of `Validate` / `RefreshValidation` |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | Pages without an error control are unaffected. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-043: RefreshValidation skips bind-source revalidation

| Field | Value |
| --- | --- |
| **Statement** | `RefreshValidation` re-renders existing error state without re-running business object validation. |
| **Trigger** | `RefreshValidation` |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | Error display can be refreshed cheaply after a partial postback. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-044: Grid validation resets formatting first

| Field | Value |
| --- | --- |
| **Statement** | Grid validation first restores every cell's normal (or alternate-row) background before applying new highlighting. |
| **Trigger** | `GetErrors` on a grid binder |
| **Enforcement** | `clsUltraGridBinder.vb` (`ResetControlFormatting`, `ResetRows`) |
| **Outcome** | Stale red cells from a previous pass are cleared. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsUltraGridBinder.vb |

---

## BR-BIND-045: Collection-level error short-circuits row validation

| Field | Value |
| --- | --- |
| **Statement** | A collection-level error reported by the bound collection short-circuits per-row validation. |
| **Trigger** | Grid `GetErrors` with a non-empty `IDataErrorInfo.Error` |
| **Enforcement** | `clsUltraGridBinder.vb` |
| **Outcome** | Collection-wide problems are reported without per-cell noise. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsUltraGridBinder.vb |

---

## BR-BIND-046: Non-IDataErrorInfo objects skipped silently

| Field | Value |
| --- | --- |
| **Statement** | Objects that do not implement `IDataErrorInfo` are skipped silently rather than raising an error. |
| **Trigger** | Cast failure in grid validation |
| **Enforcement** | `clsUltraGridBinder.vb` |
| **Outcome** | Mixed collections do not break the page. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsUltraGridBinder.vb |

---

## BR-BIND-047: Child bands resolved via BaseTableName

| Field | Value |
| --- | --- |
| **Statement** | Child bands are validated by resolving the child collection named by `Band.BaseTableName` on the parent object. |
| **Trigger** | Grid validation with band index > 0 |
| **Enforcement** | `clsUltraGridBinder.vb` |
| **Outcome** | Hierarchical grids validate the whole object graph. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsUltraGridBinder.vb |

---

## BR-BIND-048: Grid column keys map to property names

| Field | Value |
| --- | --- |
| **Statement** | Grid column keys must match business object property names — the column key is used directly as the `IDataErrorInfo` property name. |
| **Trigger** | Grid validation |
| **Enforcement** | `clsUltraGridBinder.vb` (`ValidateObject`) |
| **Outcome** | Column-to-property mapping is by convention, not configuration. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsUltraGridBinder.vb |

---

## BR-BIND-049: Grid row located by key property

| Field | Value |
| --- | --- |
| **Statement** | The grid row for an object is located by its key property value, or by the band-specific key for hierarchical grids. |
| **Trigger** | Grid validation |
| **Enforcement** | `clsUltraGridBinder.vb` |
| **Outcome** | Errors are highlighted on the correct row. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsUltraGridBinder.vb |

---

## BR-BIND-050: Invalid cells highlighted; first cell activated

| Field | Value |
| --- | --- |
| **Statement** | Every invalid cell is coloured red, and only the first invalid cell is activated. |
| **Trigger** | Grid validation |
| **Enforcement** | `clsUltraGridBinder.vb` (`ValidateObject`) |
| **Outcome** | All errors are visible; the cursor lands on the first. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsUltraGridBinder.vb |

---

## BR-BIND-051: Property validator receives bind source and error list

| Field | Value |
| --- | --- |
| **Statement** | A property-type custom validator receives the bind source, the property name and the error list so it can append its own messages. |
| **Trigger** | `PerformValidation` with `ValidationType = Property` |
| **Enforcement** | `clsCustomValidator.vb` |
| **Outcome** | Applications extend validation without subclassing. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsCustomValidator.vb |

---

## BR-BIND-052: Method validator False marks error

| Field | Value |
| --- | --- |
| **Statement** | A method-type custom validator that returns `False` marks the binder as containing an error. |
| **Trigger** | `PerformValidation` with `ValidationType = Method` |
| **Enforcement** | `clsCustomValidator.vb` |
| **Outcome** | Arbitrary cross-field checks participate in validation. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsCustomValidator.vb |

---

## BR-BIND-053: Object validator returns IsValid

| Field | Value |
| --- | --- |
| **Statement** | An object-type custom validator returns the SAIF framework object's `IsValid` value; non-framework objects are treated as valid. |
| **Trigger** | `PerformValidation` with `ValidationType = Object` |
| **Enforcement** | `clsCustomValidator.vb` |
| **Outcome** | Whole-object validity gates the page. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsCustomValidator.vb |

---

## BR-BIND-054: Missing delegate is silent no-op

| Field | Value |
| --- | --- |
| **Statement** | A custom validator with no delegate assigned is a silent no-op. |
| **Trigger** | `PerformValidation` with a `Nothing` delegate |
| **Enforcement** | `clsCustomValidator.vb` |
| **Outcome** | Partially configured validators do not fail. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsCustomValidator.vb |

---

## BR-BIND-055: Update matches binder by class name

| Field | Value |
| --- | --- |
| **Statement** | `Update` matches binders by runtime binder class name. |
| **Trigger** | `Update` overloads |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | Only the intended binder family is considered. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-056: Update matches control by UniqueID

| Field | Value |
| --- | --- |
| **Statement** | `Update` matches a binder to a control by case-insensitive `UniqueID` comparison. |
| **Trigger** | `Update` overloads |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | The right binder is re-pointed. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-057: Re-pointed binder is re-added and rebinds

| Field | Value |
| --- | --- |
| **Statement** | Re-pointing a binder's data source flags an update, then re-registers the binder via `AddBinder` and calls `ObjectToControl()`. |
| **Trigger** | `Update` overloads |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | The control shows the new data source immediately after `Update`. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-058: Dual binding limited to six control types

| Field | Value |
| --- | --- |
| **Statement** | Dual binding is supported only for the six control types in `CustomBindingControls`. |
| **Trigger** | `AddDualBinder` |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | Unsupported control types cannot be dual-bound. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-059: Dual binding separates bind and validation pairs

| Field | Value |
| --- | --- |
| **Statement** | Dual binding records the bind source/property and the validation source/property separately. |
| **Trigger** | `SetDualBinding` |
| **Enforcement** | `clsObjectBinderbase.vb` |
| **Outcome** | A control can display one object and validate another. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb |

---

## BR-BIND-060: Binder lookup by exact UniqueID

| Field | Value |
| --- | --- |
| **Statement** | `Binder(control)` matches on an exact `UniqueID` comparison and returns `Nothing` when no binder is registered for the control. |
| **Trigger** | `Binder` property |
| **Enforcement** | `clsObjectBindManager.vb` |
| **Outcome** | Callers must null-check before use. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## BR-BIND-061: Framework object detected by base-class name

| Field | Value |
| --- | --- |
| **Statement** | An object is treated as a SAIF framework business object when any type in its base-class chain is named `clsBusinessBase` or `clsBusinessCollectionBase`. |
| **Trigger** | `IsSAIFFrameWorkObject` |
| **Enforcement** | `clsObjectBinderbase.vb`, `clsObjectBindManager.vb` |
| **Outcome** | Framework-specific behavior (`MyGuid` keying, `IsValid` checks) applies only to BOF objects. |
| **Source** | SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb, SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb |

---

## Inherited business rules

Rules in this section originate from base classes provided by `SAIF.Framework.Core` (the `clsBusinessBase` / `clsBusinessCollectionBase` hierarchy). They are enforced by inherited BOF behavior, not by code in this library — this library only triggers and observes them through the `MyGuid` / `IsValid` / `IDataErrorInfo` surface described in [BR-BIND-061](#br-bind-061-framework-object-detected-by-base-class-name).

## INH-BIND-001: Broken rules gate IsValid

| Field | Value |
| --- | --- |
| **Statement** | `IsValid` becomes `False` when a business object's registered rules (evaluated by `clsRulesManager`) find a broken rule, and the broken-rules collection carries the corresponding messages until the condition clears.† |
| **Trigger** | Property change or lifecycle method that causes rule re-evaluation on the business object† |
| **Enforcement** | `clsBusinessBase` / `clsRulesManager` (`SAIF.Framework.Core`) |
| **Outcome** | Reading `IsValid` (as this library's `ValidateBindSources` does in [BR-BIND-029](#br-bind-029-reading-isvalid-triggers-rule-evaluation)) reflects the object's current rule state, and `IDataErrorInfo.Item(property)` (harvested in [BR-BIND-031](#br-bind-031-dual-binder-validates-its-validation-pair)) surfaces the broken-rule messages.† |
| **Origin** | `SAIF.Framework.Core` — `clsBusinessBase` |
| **Source** | Retrieved from indexed documentation via Legends CLI |

---

## Notes
- Mark inferred statements with `*` and unknown statements with `**`. Do not use bold inline confidence labels.
- Statements marked with `†` were retrieved from dependency library documentation via the Legends CLI RAG service.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Operations and processes](operations-processes.md)
- [API reference](api/index.md)

> **Note:** Statements marked with * were inferred from code structure, naming conventions, or contextual evidence where direct confirmation was not available in source artifacts. Statements marked with ** could not be confirmed; treat as unknown until verified. Statements marked with † were retrieved from dependency library documentation via the Legends CLI RAG service. They describe inherited behavior from the indicated origin library and should be verified if the dependency version changes.

## Sources
- SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBindManager.vb
- SAIF.Presentation.Web.Binding.Infragistics111/clsObjectBinderbase.vb
- SAIF.Presentation.Web.Binding.Infragistics111/clsCustomValidator.vb
- SAIF.Presentation.Web.Binding.Infragistics111/ASPControls/clsCheckBoxBinder.vb
- SAIF.Presentation.Web.Binding.Infragistics111/ASPControls/clsTextBoxBinder.vb
- SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsWebNumericEditBinder.vb
- SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsClassicControls/clsUltraGridBinder.vb
- SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsControls/clsWebNumericEditorBinder.vb
- SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsControls/clsWebDataGridBinder.vb
- SAIF.Presentation.Web.Binding.Infragistics111/InfragisticsControls/clsWebHierarchicalDataGridBinder.vb
