/// <summary>
        /// Initializes a new instance of the <see cref="AddRuleViewModel" /> class.
        /// </summary>
        /// <param name="configuration">The configuration.</param>
        /// <param name="visualStudioService">The visual studio service.</param>
        /// <exception cref="ArgumentNullException">The <paramref name="configuration" /> is <c>null</c>.</exception>
        /// <exception cref="ArgumentNullException">The <paramref name="visualStudioService" /> is <c>null</c>.</exception>
        public AddRuleViewModel(IConfiguration configuration, IVisualStudioService visualStudioService)
        {
            Argument.IsNotNull(() => configuration);
            Argument.IsNotNull(() => visualStudioService);

            _configuration = configuration;

            AvailableProjects = new List<string>();
            AvailableProjects.AddRange(from project in visualStudioService.GetAllProjects()
                                       select project.Name);

            RootProject = visualStudioService.GetCurrentProject().Name;

            ItemsToAdd = new List<string>(visualStudioService.GetSelectedItems());

            RuleTypes = Enum<RuleType>.ToList();

            ProjectTypes = new ObservableCollection<SelectableProjectType>();
            foreach (var projectType in ProjectTypeHelper.GetAvailableProjectTypes())
            {
                var selectableProjectType = new SelectableProjectType(projectType);
                this.SubscribeToWeakPropertyChangedEvent(selectableProjectType, OnSelectableProjectTypePropertyChanged);
                ProjectTypes.Add(selectableProjectType);
            }
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="RootProjectViewModel" /> class.
        /// </summary>
        /// <param name="rootProject">The root project.</param>
        /// <param name="visualStudioService">The visual studio service.</param>
        /// <param name="uiVisualizerService">The UI visualizer service.</param>
        /// <param name="messageService">The message service.</param>
        /// <exception cref="ArgumentNullException">The <paramref name="rootProject" /> is <c>null</c>.</exception>
        public RootProjectViewModel(RootProject rootProject, IVisualStudioService visualStudioService, IUIVisualizerService uiVisualizerService,
            IMessageService messageService)
        {
            Argument.IsNotNull(() => rootProject);
            Argument.IsNotNull(() => visualStudioService);
            Argument.IsNotNull(() => uiVisualizerService);
            Argument.IsNotNull(() => messageService);

            _uiVisualizerService = uiVisualizerService;
            _messageService = messageService;

            AvailableProjects = new List<string>();
            var availableProjects = visualStudioService.GetAllProjects();

            foreach (var availableProject in availableProjects)
            {
                AvailableProjects.Add(availableProject.Name);
            }

            RootProject = rootProject;

            Add = new Command(OnAddExecute, OnAddCanExecute);
            Edit = new Command(OnEditExecute, OnEditCanExecute);
            Remove = new Command(OnRemoveExecute, OnRemoveCanExecute);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="ProjectMappingViewModel" /> class.
        /// </summary>
        /// <param name="projectMapping">The project Mapping.</param>
        /// <param name="visualStudioService">The visual studio service.</param>
        public ProjectMappingViewModel(ProjectMapping projectMapping, IVisualStudioService visualStudioService)
        {
            Argument.IsNotNull("projectMapping", projectMapping);
            Argument.IsNotNull("visualStudioService", visualStudioService);

            ProjectMapping = projectMapping;

            AvailableProjects = new List<Project>(visualStudioService.GetAllProjects());
        }