My current programming project is on the Microsoft .NET platform, and I'm writing code in the C# language. I'm using NHibernate — a popular object/relational mapping tool — in the data access layer, and Windows Presentation Foundation (WPF) for the user interface. One of the features making WPF so attractive is data binding. Although I was initially disappointed when I found out that NHibernate's collections don't work correctly out-of-the-box with WPF data binding, I soon found Gary DeReese's blog entry which provides a (partial) solution. Gary's "NotifyingCollectionDemo
" shows how a custom collection type can be built to rectify NHibernate's shortcoming. After studying how his ObservableList
(which is actually an observable bag) was created relative to the NHibernate API, I began work on my own "ObservableCollections
" project which includes three custom collection types: observable bag, observable list, and observable set.
I've finished creating these custom collection types, so you can download the result now (updated 2008-Dec-10) to use in your own projects. The zip archive contains a Visual Studio 2005 solution that includes three projects. The "ObservableCollections
" project is the library containing the custom collections. The "ObservableCollections
Demo" project is a WPF program that you can run to play with the contents of a sample set and sample list collection. And the "CoreHelpers
" project contains some miscellaneous helper classes that I use in various projects. Before running the demo project, however, you'll need to do the following:
- Add references to the library and demo projects, pointing to the following NHibernate assemblies on your computer (unless already in the GAC): NHibernate, Castle.DynamicProxy, Iesi.Collections, and log4net.
- Change the absolute path of the database in the hibernate.cfg.xml file to match its location on your computer.
The "
CoreHelpers
" project includes a
OneToManyAssocSync
helper class that makes it easy to maintain in-memory the semantics of a one-to-many bidirectional association. The demo project shows how to use it. There is also a
ManyToManyAssocSync
class for easily maintaining many-to-many bidirectional associations. (See
this blog entry for a note about the renaming of these classes from their former names.)