Oh yeah, sorry.  I am calling this extension method to remove the
item:

        public static void RemoveRange<T>(this ICollection<T>
collection, IEnumerable<T> items)
        {
            if (items != null)
            {
                foreach (var item in items)
                {
                    collection.Remove(item);
                }
            }
        }

And this is the entity:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RGI.Utilities;
using RGI.Utilities.Validators;
using uNhAddIns.WPF.Collections;

namespace RGI.BMS.POCO
{
    [Serializable]
    public class Section : GuidPOCO
    {
        #region Constructors

        public Section() : base()
        {
            this.SectionNumbers = new ObservableSet<SectionNumber>();
        }

        #endregion

        #region Fields

        private string _Name;
        private Employee _ModifiedBy;
        private DateTime _ModifiedDate;
        private ICollection<SectionNumber> _SectionNumbers;

        #endregion

        #region Properties

        public virtual string Name
        {
            get { return _Name; }
            set
            {
                _Name = value;
                NotifyPropertyChanged("Name");
            }
        }

        public virtual Employee ModifiedBy
        {
            get { return _ModifiedBy; }
            set
            {
                _ModifiedBy = value;
                NotifyPropertyChanged("ModifiedBy");
            }
        }

        public virtual DateTime ModifiedDate
        {
            get { return _ModifiedDate; }
            set
            {
                _ModifiedDate = value;
                NotifyPropertyChanged("ModifiedDate");
            }
        }

        public virtual ICollection<SectionNumber> SectionNumbers
        {
            get { return _SectionNumbers; }
            set
            {
                _SectionNumbers = value;
                NotifyPropertyChanged("SectionNumbers");
            }
        }

        #endregion

        #region Methods

        public override int GetHashCode()
        {
            System.Text.StringBuilder sb = new
System.Text.StringBuilder();

            sb.Append(this.GetType().FullName);
            sb.Append(Id);
            sb.Append(_ModifiedBy);
            sb.Append(_ModifiedDate);
            sb.Append(_Name);

            return sb.ToString().GetHashCode();
        }

        #endregion

        #region Readonly Properties

        public virtual string NumberDisplay
        {
            get
            {
                StringBuilder bld = new StringBuilder();

                //Get sorted list
                var numbers = this.SectionNumbers.OrderBy(o =>
o.Number);

                foreach (var item in numbers)
                {
                    bld.Append(item.Number);
                    if (!numbers.Last().Equals(item))
                        bld.Append(", ");
                }

                return bld.ToString();
            }
        }

        #endregion

        #region Validation

        public override string this[string columnName]
        {
            get { return CheckValidation(this, columnName); }
        }

        #endregion
    }
}

Thanks again for all the help,
Chris


On Aug 24, 6:54 pm, José Romaniello <[email protected]> wrote:
> Sorry, I want to see the property where you need to put the observableset.
> And the code that you are using to remove an item from that collection.
>
> 2009/8/24 Chris Willard <[email protected]>
>
>
>
> > Below is my base entity class.  I have a class (GuidPOCO) that
> > inherits from BindableObject and just implements an Id property as a
> > guid along with some vaidation logic.
>
> >    /// <summary>
> >    /// Implements the INotifyPropertyChanged interface and
> >    /// exposes a NotifyPropertyChanged method for derived
> >    /// classes to raise the PropertyChange event.  The event
> >    /// arguments created by this class are cached to prevent
> >    /// managed heap fragmentation.
> >    /// </summary>
> >    [Serializable]
> >    public abstract class BindableObject : INotifyPropertyChanged,
> > IEditableObject, IDataErrorInfo
> >    {
> >        #region Data
>
> >        private static readonly Dictionary<string,
> > PropertyChangedEventArgs> eventArgCache;
> >        private const string ERROR_MSG = "{0} is not a public property
> > of {1}";
> >        private static readonly object syncLock = new object();
> >        private HybridDictionary oldState;
>
> >        #endregion // Data
>
> >        #region Constructors
>
> >        static BindableObject()
> >        {
> >            eventArgCache = new Dictionary<string,
> > PropertyChangedEventArgs>();
> >        }
>
> >        protected BindableObject()
> >        {
>
> >        }
>
> >        #endregion // Constructors
>
> >        #region Public Members
>
> >        /// <summary>
> >        /// Raised when a public property of this object is set.
> >        /// </summary>
> >        [field: NonSerialized]
> >        public virtual event PropertyChangedEventHandler
> > PropertyChanged;
>
> >        /// <summary>
> >        /// Returns an instance of PropertyChangedEventArgs for
> >        /// the specified property name.
> >        /// </summary>
> >        /// <param name="propertyName">
> >        /// The name of the property to create event args for.
> >        /// </param>
> >        public static PropertyChangedEventArgs
> > GetPropertyChangedEventArgs(string propertyName)
> >        {
> >            if (String.IsNullOrEmpty(propertyName))
> >                throw new ArgumentException("propertyName cannot be
> > null or empty.");
>
> >            PropertyChangedEventArgs args;
> >            lock (BindableObject.syncLock)
> >            {
> >                if (!eventArgCache.TryGetValue(propertyName, out
> > args))
> >                {
> >                    eventArgCache.Add(propertyName, args = new
> > PropertyChangedEventArgs(propertyName));
> >                }
> >            }
> >            return args;
> >        }
>
> >        public abstract bool IsPropertyValid { get; }
>
> >        public abstract bool IsValid { get; }
>
> >        public abstract string ValidationErrors { get; }
>
> >        #endregion // Public Members
>
> >        #region Protected Members
>
> >        /// <summary>
> >        /// Derived classes can override this method to
> >        /// execute logic after a property is set. The
> >        /// base implementation does nothing.
> >        /// </summary>
> >        /// <param name="propertyName">
> >        /// The property which was changed.
> >        /// </param>
> >        protected virtual void AfterPropertyChanged(string
> > propertyName)
> >        {
> >        }
>
> >        /// <summary>
> >        /// Attempts to raise the PropertyChanged event, and
> >        /// invokes the virtual AfterPropertyChanged method,
> >        /// regardless of whether the event was raised or not.
> >        /// </summary>
> >        /// <param name="propertyName">
> >        /// The property which was changed.
> >        /// </param>
> >        protected virtual void NotifyPropertyChanged(string
> > propertyName)
> >        {
> >            this.VerifyProperty(propertyName);
>
> >            PropertyChangedEventHandler handler =
> > this.PropertyChanged;
> >            if (handler != null)
> >            {
> >                // Get the cached event args.
> >                PropertyChangedEventArgs args =
> >                    GetPropertyChangedEventArgs(propertyName);
>
> >                // Raise the PropertyChanged event.
> >                handler(this, args);
> >            }
>
> >            this.AfterPropertyChanged(propertyName);
> >        }
>
> >        #endregion // Protected Members
>
> >        #region Private Helpers
>
> >        [Conditional("DEBUG")]
> >        private void VerifyProperty(string propertyName)
> >        {
> >            // Thanks to Rama Krishna Vavilala for the tip to use
> > TypeDescriptor here, instead of manual
> >            // reflection, so that custom properties are honored too.
> >            //
> >http://www.codeproject.com/KB/WPF/podder1.aspx?msg=2381272#xx2381272xx
>
> >            bool propertyExists = TypeDescriptor.GetProperties
> > (this).Find(propertyName, false) != null;
> >            if (!propertyExists)
> >            {
> >                // The property could not be found,
> >                // so alert the developer of the problem.
>
> >                string msg = string.Format(
> >                    ERROR_MSG,
> >                    propertyName,
> >                    this.GetType().FullName);
>
> >                Debug.Fail(msg);
> >            }
> >        }
>
> >        #endregion // Private Helpers
>
> >        #region Implementation of IEditableObject
>
> >        public virtual void BeginEdit()
> >        {
> >            oldState = new HybridDictionary();
> >            foreach (PropertyInfo property in this.GetType
> > ().GetProperties())
> >            {
> >                if (property.CanWrite)
> >                {
> >                    oldState[property.Name] = property.GetValue(this,
> > null);
> >                }
> >            }
> >        }
>
> >        public virtual void EndEdit()
> >        {
> >            oldState = null;
> >        }
>
> >        public virtual void CancelEdit()
> >        {
> >            foreach (PropertyInfo property in this.GetType
> > ().GetProperties())
> >            {
> >                if (property.CanWrite)
> >                {
> >                    property.SetValue(this, oldState[property.Name],
> > null);
> >                }
> >            }
> >            oldState = null;
> >        }
>
> >        #endregion
>
> >        #region Implementation of IDataErrorInfo
>
> >        public abstract string this[string columnName] { get; }
> >        public abstract string Error { get; }
>
> >        #endregion
> >     }
>
> > On Aug 24, 6:28 pm, José Romaniello <[email protected]> wrote:
> > > could your post the entity class?
>
> > > 2009/8/24 Chris Willard <[email protected]>
>
> > > > Hi José,
>
> > > > I am attempting to try out your ObservableSet implementation but am
> > > > having a couple of issues.  First off I can't seem to get the global
> > > > registration working using the code you supplied below.  I seems to be
> > > > ignoring the configuration property change and using the default
> > > > implementation.  Below is how I am currently handling the
> > > > configuration.
>
> > > >        private ISessionFactory BuildSessionFactory()
> > > >        {
> > > >            ISessionFactory result =
> > > >                   Fluently.Configure()
> > > >                       .Database(MsSqlConfiguration.MsSql2005
> > > >                           .ConnectionString(c => c
> > > >                               .FromConnectionStringWithKey
> > > > (ConnectionStringName))
> > > >                           .Cache(c => c
> > > >                               .UseQueryCache()
> > > >                               .ProviderClass<HashtableCacheProvider>
> > > > ())
> > > >                           .ShowSql())
> > > >                       .ExposeConfiguration(ConfigureLazyLoad)
> > > >                       .ExposeConfiguration(ConfigureCollectionType)
> > > >                       .Mappings(m => m
> > > >                           .FluentMappings.AddFromAssembly
> > > > (_MapAssembly)
>
> > > > .ConventionDiscovery.AddFromAssemblyOf<ClassConvention>
> > > > ())
> > > >                       .ExposeConfiguration(ConfigureValidator)
> > > >                       .BuildSessionFactory();
>
> > > >            return result;
> > > >        }
>
> > > >        private void ConfigureCollectionType(Configuration
> > > > configuration)
> > > >        {
> > > >            configuration.SetProperty
> > > > (Cfg.Environment.CollectionTypeFactoryClass, typeof
>
> > (Collection.Observable.ObservableCollectionTypeFactory).AssemblyQualifiedName);
> > > >        }
>
> > > > If I manually set the CollectionType within one of my mapping classes
> > > > (.CollectionType<ObservableSetType<SectionNumber>>();) it seems to
> > > > work, although I am getting an error (Collection Remove event must
> > > > specify item position) when I try to remove an item from the
> > > > collection.
>
> > > > Thanks again,
> > > > Chris
>
> > > > On Aug 24, 4:57 pm, José Romaniello <[email protected]> wrote:
> > > > > There is also an ObservableSet. I use this class as a "transient
> > > > observable
> > > > > set" since .net framework only have an observable list.
> > > > > In order to configure the collection type factory I use:
>
> > > > > configuration.Properties[Environment.CollectionTypeFactoryClass]
> > > > > = typeof (WpfCollectionTypeFactory).AssemblyQualifiedName;
>
> > > > > Stay in sync with the WPF sample (athttp://
> > nhforge.org/blogs/nhibernate/
> > > > ).
>
> > > > > 2009/8/24 Chris Willard <[email protected]>
>
> > > > > > That is exactly what I needed!  I really appreciate all your great
> > > > > > work...
>
> > > > > > Chris
>
> > > > > > On Aug 24, 3:02 pm, Fabio Maulo <[email protected]> wrote:
> > > > > > > The proposal of CollectionTypeFactoryClass is allow the
> > substitutions
> > > > of
> > > > > > all
> > > > > > > persistent collections by default.If you want see an
> > implementation
>
> ...
>
> read more »
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to