/// <summary>
        /// Searches for any products matching the given keyword and populates the search results.
        /// </summary>
        public void Search()
        {
            if (!CanSearch())
            {
                if (SearchResults != null && SearchResults.Any())
                {
                    SearchResults.Clear();
                }
                return;
            }

            try
            {
                if (OnSearchStarted != null)
                {
                    OnSearchStarted(this, new SearchEventArgs {
                        SearchTerm = SearchTerm
                    });
                }

#if DEBUG
                System.Diagnostics.Debug.WriteLine(string.Format("Searching products for term '{0}'.", SearchTerm));
                var searchStopwatch = new System.Diagnostics.Stopwatch();
                searchStopwatch.Start();
#endif

                var invalidatedMatches = SearchResults.Where(p => !IsMatch(p, SearchTerm)).ToList();
                foreach (var match in invalidatedMatches)
                {
                    SearchResults.Remove(match);
                }

                var newMatches = ItemsToSearch
                                 .Where(p => !SearchResults.Any(r => r.ProductID == p.ProductID) && IsMatch(p, SearchTerm))
                                 .OrderBy(p => p.Name);

                foreach (var match in newMatches)
                {
                    SearchResults.Add(match);
                }

#if DEBUG
                searchStopwatch.Stop();
                System.Diagnostics.Debug.WriteLine(string.Format("Searchings products for term '{0}' finished in {1} millisecond(s) and return {2} result(s).", SearchTerm, searchStopwatch.ElapsedMilliseconds.ToString(), SearchResults.Count.ToString()));
#endif
            }
            catch
            {
            }
            finally
            {
                if (OnSearchFinished != null)
                {
                    OnSearchFinished(this, new SearchEventArgs {
                        SearchTerm = SearchTerm, SearchResultsCount = SearchResults.Count
                    });
                }
            }
        }
 bool CanSearch()
 {
     if (ItemsToSearch == null || !ItemsToSearch.Any() ||
         SearchTerm == HelpText || string.IsNullOrEmpty(SearchTerm) || SearchTerm.Trim().Length < SearchTermMinimumLength)
     {
         return(false);
     }
     else
     {
         return(true);
     }
 }