/// <summary> Метод обновления списков запросов и приглашений </summary>
        public void RefreshRequestInvite()
        {
            var listModelContactInvite = DataSourceContact.GetInviteListModelContact();

            // для сортировки сначала непрочитанные потом прочитанные
            ListModelContactInvite.Clear();
            ListModelContactInvite.AddRange(listModelContactInvite.FindAll(obj => obj.ModelContactSubscriptionObj.ModelEnumSubscriptionStatusObj.Code == 0));
            ListModelContactInvite.AddRange(listModelContactInvite.FindAll(obj => obj.ModelContactSubscriptionObj.ModelEnumSubscriptionStatusObj.Code != 0));

            ListModelContactRequest.Clear();
            ListModelContactRequest = DataSourceContact.GetRequestListModelContact();

            CountInvateUnread = DataSourceContact.GetCountInviteUnread();
        }
        ///// <summary> Обработчик изменения модели внутри логики C++ </summary>
        //public void DoCallback(object sender, DoCallbackArgs e)
        //{
        //if (e.ModelName == "ContactsPresence")
        //{
        //    // поменял на этот некрасивый вариант для Perfomance
        //    //CurrentDispatcher.BeginInvoke(new Action(ChangedStatusListModelContact));

        //    ChangedStatusListModelContact(e.EntityIds);
        //}

        //if (e.ModelName == "Contacts")
        //{
        //    // поменял на этот некрасивый вариант для Perfomance
        //    //CurrentDispatcher.BeginInvoke(new Action(ChangedListModelContact));
        //    ChangedListModelContact();
        //}

        //if (e.ModelName == "ContactSubscriptions")
        //{
        //    CurrentDispatcher.BeginInvoke(new Action(ChangedInviteUnread));

        //    //Action action = () => ChangedListModelContactSubscription(e.EntityIds);

        //    //CurrentDispatcher.BeginInvoke(action);

        //    ChangedListModelContactSubscription(e.EntityIds);
        //}

        //if (e.ModelName == "NetworkStateChanged")
        //{
        //    Action action = () => ModelConnectStateObj = _dataSourceUtility.GetCurrentModelConnectState();

        //    CurrentDispatcher.BeginInvoke(action);
        //}
        //}

        ///// <summary> Обработчик изменения статусов в списке контактов внутри логики C++ </summary>
        //private void ChangedStatusListModelContact(string[] arrayXmppId)
        //{
        //    var dictionary = _dataSourceContact.GetModelContactStatusForAsync(arrayXmppId);

        //    foreach (var i in dictionary)
        //    {
        //        var modelContact = ListModelContact.FirstOrDefault(obj => obj.XmppId == i.Key);

        //        if (modelContact != null)
        //        {
        //            Action action = () =>
        //            {
        //                modelContact.ModelEnumUserBaseStatusObj = i.Value.ModelEnumUserBaseStatusObj;
        //                modelContact.UserExtendedStatus = i.Value.UserExtendedStatus;
        //            };

        //            CurrentDispatcher.BeginInvoke(action);
        //        }
        //    }
        //}

        ///// <summary> Обработчик изменения списка контактов внутри логики C++ </summary>
        //private void ChangedListModelContact()
        //{
        //    var listChangedModelContact = new List<ModelContact>();
        //    var listDeletedModelContact = new List<ModelContact>();

        //    _dataSourceContact.GetListChangedModelContact(listChangedModelContact, listDeletedModelContact);

        //    foreach (var modelContact in listChangedModelContact.Where(obj => obj.Id > 0))
        //    {
        //        var changedModelContact = ListModelContact.FirstOrDefault(obj => obj.Id == modelContact.Id);

        //        if (changedModelContact != null)
        //        {
        //            // поменял на этот некрасивый вариант для Perfomance
        //            Action action = () =>
        //            {
        //                var modelContactCopy = modelContact.GetDeepCopy();

        //                changedModelContact.Avatar = modelContactCopy.Avatar;
        //                changedModelContact.Blocked = modelContactCopy.Blocked;
        //                changedModelContact.DodicallId = modelContactCopy.DodicallId;
        //                changedModelContact.NativeId = modelContactCopy.NativeId;
        //                changedModelContact.White = modelContactCopy.White;
        //                changedModelContact.XmppId = modelContactCopy.XmppId;
        //                changedModelContact.FirstName = modelContactCopy.FirstName;
        //                changedModelContact.MiddleName = modelContactCopy.MiddleName;
        //                changedModelContact.LastName = modelContactCopy.LastName;
        //                changedModelContact.ModelEnumUserBaseStatusObj = modelContactCopy.ModelEnumUserBaseStatusObj;
        //                changedModelContact.UserExtendedStatus = modelContactCopy.UserExtendedStatus;
        //                changedModelContact.ModelContactSubscriptionObj = modelContactCopy.ModelContactSubscriptionObj;
        //                //Debug.WriteLine(modelContactCopy.FullName + " " + modelContactCopy.ModelContactSubscriptionObj.Ask);
        //                changedModelContact.ListModelUserContact = modelContactCopy.ListModelUserContact;
        //                changedModelContact.ListModelUserContactExtra = modelContactCopy.ListModelUserContactExtra;
        //            };

        //            CurrentDispatcher.BeginInvoke(action);

        //            //changedModelContact.Avatar = modelContact.Avatar;
        //            //changedModelContact.Blocked = modelContact.Blocked;
        //            //changedModelContact.DodicallId = modelContact.DodicallId;
        //            //changedModelContact.NativeId = modelContact.NativeId;
        //            //changedModelContact.White = modelContact.White;
        //            //changedModelContact.XmppId = modelContact.XmppId;
        //            //changedModelContact.FirstName = modelContact.FirstName;
        //            //changedModelContact.MiddleName = modelContact.MiddleName;
        //            //changedModelContact.LastName = modelContact.LastName;
        //            //changedModelContact.ModelEnumUserBaseStatusObj = modelContact.ModelEnumUserBaseStatusObj;
        //            //changedModelContact.UserExtendedStatus = modelContact.UserExtendedStatus;
        //            //changedModelContact.ModelContactSubscriptionObj = modelContact.ModelContactSubscriptionObj;
        //            //changedModelContact.ListModelUserContact = modelContact.ListModelUserContact;
        //            //changedModelContact.ListModelUserContactExtra = modelContact.ListModelUserContactExtra;
        //        }
        //        else
        //        {
        //            // поменял на этот некрасивый вариант для Perfomance
        //            Action action = () =>
        //            {
        //                var modelContactCopy = modelContact.GetDeepCopy();

        //                ListModelContact.Add(modelContactCopy);
        //            };

        //            CurrentDispatcher.BeginInvoke(action);

        //            //ListModelContact.Add(modelContact);
        //        }
        //    }

        //    foreach (var modelContact in listDeletedModelContact)
        //    {
        //        var deletedModelContact = ListModelContact.FirstOrDefault(obj => obj.Id == modelContact.Id);

        //        Action action = () => { ListModelContact.Remove(deletedModelContact); };

        //        CurrentDispatcher.BeginInvoke(action);

        //        //ListModelContact.Remove(deletedModelContact);
        //    }

        //    CurrentDispatcher.BeginInvoke(new Action(ApplyFilter));
        //}

        ///// <summary> Обработчик изменения подписки контактов внутри логики C++ </summary>
        //private void ChangedListModelContactSubscription(string[] arrayXmppId)
        //{
        //    if (ListModelContact == null) return;

        //    var dictionary = _dataSourceContact.GetDictionaryModelContactSubscriptionByArrayXmppId(arrayXmppId);

        //    foreach (var i in dictionary)
        //    {
        //        var modelContact = ListModelContact.FirstOrDefault(obj => obj.XmppId == i.Key);

        //        if (modelContact != null)
        //        {
        //            Action action = () => { modelContact.ModelContactSubscriptionObj = i.Value.GetDeepCopy(); };

        //            Debug.WriteLine(modelContact.FullName + " - " + i.Value.Ask);

        //            Thread.Sleep(1000);

        //            CurrentDispatcher.BeginInvoke(action);

        //            //modelContact.ModelContactSubscriptionObj = i.Value;
        //        }
        //    }

        //    _dataSourceContact.RefreshModelContactStatus(ListModelContact.Where(obj => dictionary.ContainsKey(obj.XmppId)).ToList());
        //}

        /// <summary> Обработчик изменения кол-во непрочитанных приглашений </summary>
        public void ChangedInviteUnread()
        {
            CountInvateUnread = DataSourceContact.GetCountInviteUnread();
        }