At the moment, the way people are figuring out how to add
observability to their NH collections for the sake of WPF, is by
downloading the solution from my blog, then looking at the demo
project. Having an instructional article to go along with the demo
would be ideal, but sorry to say I haven't written one. That would be
great if someone started one in the NH-Forge wiki, as Fabio suggests.
On Dec 8, 4:55 pm, "Fabio Maulo" <[EMAIL PROTECTED]> wrote:
> Hi Andrew.Do you can add a wiki page, on NH-Forge (How To section), with the
> implementation of your Observable bag and how use it ?
> You can even upload sources in your page (in nh-forge) and link the wiki to
> it.
>
> For "usage" note take a look to <typedef> features (example available
> in NHibernate.Test.UserCollection.Parameterized)
>
> Really thanks for your contribution and for the right spirit.
> Fabio Maulo.
>
> 2008/12/7 Andrew C <[EMAIL PROTECTED]>
>
>
>
>
>
> > HappyNomad:
>
> > I got ObservableBag working with the new trunk by extending
> > PersistantGenericBag and replacing the InnerBag with an
> > ObservableCollection. See below:
>
> > [Serializable, DebuggerTypeProxy(typeof
> > (NHibernate.DebugHelpers.CollectionProxy<>))]
> > public class PersistentObservableBag<T> : PersistentGenericBag<T>,
> > INotifyCollectionChanged
> > {
>
> > public PersistentObservableBag(ISessionImplementor session)
> > : base(session)
> > {
> > }
>
> > public PersistentObservableBag(ISessionImplementor session,
> > ICollection<T> coll)
> > : base(session, coll)
> > {
> > INotifyCollectionChanged collection = coll as
> > INotifyCollectionChanged;
> > if (collection != null)
> > {
> > collection.CollectionChanged += new
> > NotifyCollectionChangedEventHandler(OnCollectionChanged);
> > }
> > }
>
> > public override void BeforeInitialize(ICollectionPersister
> > persister, int anticipatedSize)
> > {
> > this.InternalBag = (IList<T>)
> > persister.CollectionType.Instantiate(anticipatedSize);
> > INotifyCollectionChanged collection = base.InternalBag as
> > INotifyCollectionChanged;
> > if (collection != null)
> > {
> > collection.CollectionChanged += new
> > NotifyCollectionChangedEventHandler(OnCollectionChanged);
> > }
> > }
>
> > protected void OnCollectionChanged(object sender,
> > NotifyCollectionChangedEventArgs e)
> > {
> > if (CollectionChanged != null)
> > CollectionChanged(this, e);
> > }
>
> > public event NotifyCollectionChangedEventHandler
> > CollectionChanged;
>
> > }
>
> > public class ObservableBagType<T> : IUserCollectionType
> > {
> > #region IUserCollectionType Members
>
> > public bool Contains(object collection, object entity)
> > {
> > return ((IList<T>)collection).Contains((T)entity);
> > }
>
> > public IEnumerable GetElements(object collection)
> > {
> > return (IEnumerable)collection;
> > }
>
> > public object IndexOf(object collection, object entity)
> > {
> > return ((IList<T>)collection).IndexOf((T)entity);
> > }
>
> > public object ReplaceElements(object original, object target,
> > ICollectionPersister persister, object owner, IDictionary copyCache,
> > ISessionImplementor session)
> > {
> > IList<T> result = (IList<T>)target;
> > result.Clear();
> > foreach (object item in ((IEnumerable)original))
> > result.Add((T)item);
> > return result;
> > }
>
> > // return an instance of the inner collection type
> > public object Instantiate(int anticipatedSize)
> > {
> > return new ObservableCollection<T>();
> > }
>
> > public IPersistentCollection Instantiate(ISessionImplementor
> > session, ICollectionPersister persister)
> > {
> > return new PersistentObservableBag<T>(session);
> > }
>
> > public IPersistentCollection Wrap(ISessionImplementor session,
> > object collection)
> > {
> > return new PersistentObservableBag<T>(session,
> > (ICollection<T>)collection);
> > }
>
> > #endregion
> > }
>
> --
> Fabio Maulo