/// <summary>
        /// Called when events are resumed the last time, i.e. is not fired when nested.
        /// Fires the <see cref="DataChanged"/> event when changes are pending.
        /// </summary>
        protected override void OnEventsResumed()
        {
            lock (SyncRoot)
            {
                // Fire pending DataChanged event
                if (_lastChangeAction.HasValue)
                {
                    // Build event
                    var properties = new List <Guid>(_committedPropertiesChanged);
                    foreach (var property in _instancePropertiesChanged)
                    {
                        if (!properties.Contains(property))
                        {
                            properties.Add(property);
                        }
                    }
                    var args = new DataObjectChangeEventArgs(_lastChangeAction.Value, properties.ToArray());

                    // Clear cache
                    _committedPropertiesChanged.Clear();
                    _instancePropertiesChanged.Clear();
                    _lastChangeAction = null;

                    // Fire event
                    if (DataChanged != null)
                    {
                        OnDataChanged(args);
                    }
                }

                // Call base class method
                base.OnEventsResumed();
            }
        }
 /// <summary>
 /// Notifies this object that a related data object has changed.
 /// </summary>
 /// <param name="changed">Changed data object instance.</param>
 /// <param name="change">Change details.</param>
 public void NotifyChange(IDataObject changed, DataObjectChangeEventArgs change)
 {
     lock (SyncRoot)
     {
         // Suspend events
         SuspendEvents();
         try
         {
             // Notify subclass
             OnChangeNotification(changed, change);
         }
         finally
         {
             // Resume events
             ResumeEvents();
         }
     }
 }
Beispiel #3
0
 /// <summary>
 /// Bubbles the <see cref="DataObject.DataChanged"/> event of an item in this collection.
 /// </summary>
 protected virtual void OnItemDataChanged(object sender, DataObjectChangeEventArgs e)
 {
     // Fire event
     ItemDataChanged?.Invoke(sender, e);
 }
 /// <summary>
 /// Handles change notification events, when this object is notified that
 /// a related data object has changed via the <see cref="NotifyChange"/> method.
 /// </summary>
 /// <remarks>
 /// Thread safe locking, <see cref="EventObject.SuspendEvents"/> and <see cref="EventObject.ResumeEvents"/> are handled by the caller.
 /// The base class implementation does nothing.
 /// </remarks>
 /// <param name="changed">Changed data object instance.</param>
 /// <param name="change">Change details.</param>
 protected virtual void OnChangeNotification(IDataObject changed, DataObjectChangeEventArgs change)
 {
 }
 /// <summary>
 /// Fires the <see cref="DataChanged"/> event.
 /// </summary>
 protected virtual void OnDataChanged(DataObjectChangeEventArgs change)
 {
     // Fire event
     DataChanged?.Invoke(this, change);
 }