internal void Fire(NotifyCollectionChangedEventArgs argument, bool Sync)
        {
            NotifyCollectionChangedEventHandler Event = _Event;
            if (Event == null)
                return;

            foreach (NotifyCollectionChangedEventHandler del in Event.GetInvocationList())
            {
                Dispatcher dip = del.GetDispatcher();

                // If the subscriber is a DispatcherObject and different thread
                if (dip != null && ((!Sync) || dip.CheckAccess() == false))
                {
                    Action CallNotifyCollectionChangedEventHandler = () =>
                    {
                        argument.Decompose().Apply(ar => del(_Owner, ar));
                    };

                    //// If the subscriber is a DispatcherObject and different thread
                    // Invoke handler in the target dispatcher's thread
                    if (Sync)
                        dip.Invoke(DispatcherPriority.DataBind, CallNotifyCollectionChangedEventHandler);
                    else
                        dip.BeginInvoke(DispatcherPriority.DataBind, CallNotifyCollectionChangedEventHandler);
                }
                else
                {
                    if (Sync)
                        del(_Owner, argument);
                    else
                        del.BeginInvoke(_Owner, argument, null, null);
                }
            }
        }