/// <summary>
        /// Load projects from certain user
        /// </summary>
        /// <param name="username">The name of the user which Shelvesets should be fetched</param>
        /// <returns>State if fetching Projects was succesfull</returns>
        public FetchState FetchProjects(string username = "")
        {
            if (m_TfsConfigurationServer == null)
            {
                return(FetchState.UserNotLoggedIn);
            }
            var configurationServerNode = m_TfsConfigurationServer.CatalogNode;

            if (configurationServerNode == null)
            {
                return(FetchState.NoProject);
            }
            IReadOnlyCollection <CatalogNode> tfsTeamProjectNodes = configurationServerNode.QueryChildren(
                new Guid[] { CatalogResourceTypes.ProjectCollection },
                false,
                CatalogQueryOptions.None);


            foreach (CatalogNode projectNode in tfsTeamProjectNodes)
            {
                var tfsTeamProjectCollection = m_TfsConfigurationServer.GetTeamProjectCollection(
                    new Guid(projectNode.Resource.Properties[s_TeamConfigServerIdProperty]));
                m_VersionControl = tfsTeamProjectCollection.GetService <VersionControlServer>();
                PendingSet[] allSets;

                // at start up or context change use authenticated user and on search the given username
                if (string.IsNullOrEmpty(username))
                {
                    TeamFoundationIdentity identity;

                    m_TfsConfigurationServer.GetAuthenticatedIdentity(out identity);
                    allSets = m_VersionControl.QueryShelvedChanges(
                        null,
                        identity.DisplayName);
                    username = identity.DisplayName;
                }
                else
                {
                    try
                    {
                        allSets = m_VersionControl.QueryShelvedChanges(
                            null,
                            username);
                    }
                    catch (Microsoft.TeamFoundation.VersionControl.Client.IdentityNotFoundException)
                    {
                        return(FetchState.UserNotFound);
                        //nothing to do here
                        //m_VersionControl.QueryShelvedChanges throws an exception if the given username is not valid
                    }
                }

                IList <PendingSetWrapper> wrapper = new List <PendingSetWrapper>();

                //get Shelveset from PendingSet.
                //need the CreatedDate from the Shelveset to order the PndingSets
                foreach (PendingSet set in allSets)
                {
                    Shelveset[] shelvesets = m_VersionControl.QueryShelvesets(set.Name, username);
                    wrapper.Add(new PendingSetWrapper(set, shelvesets[0].CreationDate));
                }
                var orderedWrapper = wrapper.OrderByDescending(d => d.CreationDate.Date);

                Project = new ProjectData(projectNode.Resource.DisplayName, orderedWrapper.ToArray());
            }

            OnSetUsername(username);
            OnChanged(Project);

            return(FetchState.Successful);
        }
 // ProjectList Changed
 protected void OnChanged(
     ProjectData project)
 {
     ContextChanged?.Invoke(project);
 }