too much boiled code.
2009/8/24 Chris Willard <[email protected]>
>
> 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 »
> >
>
--
Fabio Maulo
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---