Historically, data binding in VCL has always had a TDataSet instance as subject. The data has always been stored in a TDataSet descendant and manipulated through the TDataSet interface (every experienced Delphi developer can list most of the method names of TDataSet, such as Edit, Post, Cancel, Prior, and Next). A TDataSet instance can be seen as a list (or array) of records, representing some dataset with a rectangular shape (rows and columns). The dataset has a state (a current record, a modality such as browsing versus editing, some filtering and/or sorting conditions, and so on) and acts like what today would be called a model for the data (including extended metadata and constraints).
Once we had a place to store data, the problem of surfacing this data to the UI became apparent. Delphi had a set of standard components used to manipulate strings, dates, multiple-choice selections, and a set of classes (components) to compose the UI in order...