Introduction
DataBinding
is a very powerful tool to push data from objects to the user interface and pull back user data to the object. However, when you have complex objects, Windows Form DataBinding
is not so powerful.
In this article, I will demonstrate how we can make a complex databinding between business objects and Windows Forms controls by implementing a few interfaces.
The "Complex Object" Sample
The sample here is a book that has Name
, PagesNumber
and Author
properties. The author
has name
and BirthDate
properties. In the object model, we create a book
class that implements book
properties and a second class Author
. The Author
property in the Book
class is typed as Author
.
Here is the code needed in the Book
class:
public class Book : BindableObject
{
public Book()
{
}
public Book(string name,int pagesnumber, Author a)
{
this.Name = name;
this.PagesNumber = pagesnumber;
this.Author = a;
}
private string _Name;
public string Name
{
get{return _Name;}
set{_Name = value;}
}
private int _PagesNumber;
public int PagesNumber
{
get{return _PagesNumber;}
set{_PagesNumber = value;}
}
public Author _Author = new Author();
public Author Author
{
get{return _Author;}
set{_Author = value;}
}
}
The DataBinding Problem
When we want to create a collection of books and show it to the user in datagrid
, we can show only the name
and Pagesnumber
information. That is because in the MappingName
property of the DatagridTextBox
, we cannot put Author.Name
for example to display the name of the book
's author
.
The Solution
When binding an object to a Windows Form control, the Framework uses reflection to get bindable properties of the object. However, when an object implements the IcustomTypeDescriptor
interface, the framework gets object properties from IcustomTypeDescriptor.GetProperties()
method. So the solution is to include all the properties we need to display.
In book example IcustomTypeDescriptor.GetProperties() will return : Name, PagesNumber, Author.Name and Author.BirthDate properties.
Doing this, you can display the Author name
of a book in a datagrid
just by writing "Author.Name
" in the MappingName
property of the DatagridTextBox
. Also if you have a multicolumn combobox, you can display both Book Name
and Author Name
.
The Source Code
A class name BindableObject
is included in the project. This class implements IcustomTypeDescriptor
interface. All business objects created (Book
and Author
classes) inherit from this class. So no code must be written in business classes.
To get properties of an object, reflection is used. To increase performance, I implemented a cache in which I store objects structure, so reflection is used only one time for each type.
When binding a collection, it must implement the ItypedList
interface to call the IcustomTypeDescriptor.GetProperties()
method. So the BookCollection
class inherits from BindableCollection
class included in the project.
History
- 2nd July, 2005: Initial post