简体   繁体   中英

C# - How to search into the ObservableCollection?

I am developing a app in windows phone 7. I have a list box with items of observable collection. Now i want to search into that list box items. I want filter the items which is typed in the Text Box. If i type 'a' mean the list box items should shows the items which is start with 'a'. If i type 'az' mean it should show the items start with 'az'.

public class SortingExampleViewModel : ReactiveObject
    {
        public string _SearchText = "";
        public string SearchText
        {
            get { return _SearchText; }
            set { this.RaiseAndSetIfChanged(x => x.SearchText, value); }
        }

        public static ObservableCollection<items> _sordtedList;
        public ObservableCollection<items> sordtedList
        {
            get { return _sordtedList; }
            set { this.RaiseAndSetIfChanged(x => x.sordtedList, value); }
        }

        public static ObservableCollection<items> _tempSordtedList;
        public ObservableCollection<items> tempSordtedList
        {
            get { return _tempSordtedList; }
            set { this.RaiseAndSetIfChanged(x => x.tempSordtedList, value); }
        }


        public ReactiveAsyncCommand ExecuteSearch { get; set; }

        public SortingExampleViewModel()
        {
            ObservableCollection<items> myData = new ObservableCollection<items>()
            {
                new items(){firstName = "Vijay Dhas",age=27},
                new items(){firstName = "Ramaraj",age=28},
                new items(){firstName = "Arun",age=29},
                new items(){firstName = "Prabhu",age=30},
                new items(){firstName = "Pranesh",age=31},
                new items(){firstName = "Testing",age=32}
            };


            sordtedList = new ObservableCollection<items>(from i in myData orderby i.firstName select i);

            var canConfirm = this.WhenAny(x => x.SearchText, (search) => SearchMethod(search.Value));
            ExecuteSearch = new ReactiveAsyncCommand(canConfirm, 0);
        }

        public Boolean SearchMethod(String searchValue)
        {
            var col = (ObservableCollection<items>)(sordtedList.Where(p => p.firstName.Contains(searchValue)));
            foreach (items objTest in col)
            {
                tempSordtedList.Add(objTest);
            }
            sordtedList = tempSordtedList;
            return true;
        }
    }

    public class items
    {
        public string firstName { get; set; }
        public int age { get; set; }
    }

But here i am getting Error in this line:

var col = (ObservableCollection<items>)(sordtedList.Where(p => p.firstName.Contains(searchValue)));

It showing Unknown error. Please help me to search in the listbox.

I got the solution.

 public SortingExampleViewModel()
        {
            ObservableCollection<items> myData = new ObservableCollection<items>()
            {
                new items(){firstName = "Vijay Dhas",age=27},
                new items(){firstName = "Ramaraj",age=28},
                new items(){firstName = "Arun",age=29},
                new items(){firstName = "Prabhu",age=30},
                new items(){firstName = "Pranesh",age=31},
                new items(){firstName = "Testing",age=32}
            };


            sordtedList = new ObservableCollection<items>(from i in myData orderby i.firstName select i);
            temp = sordtedList;       

            var canConfirm = this.WhenAny(x => x.SearchText, (search) => SearchMethod(search.Value));
            ExecuteSearch = new ReactiveAsyncCommand(canConfirm, 0);
        }

 public Boolean SearchMethod(String searchValue)
        {
            ObservableCollection<items>  tempList = new ObservableCollection<items>();            
            tempList = temp;
            tempSordtedList = new ObservableCollection<items>();
            foreach (items items in tempList)
            {
                if (items.firstName.ToLower().StartsWith(searchValue.ToLower()))
                {
                    tempSordtedList.Add(items);
                }
            }

            sordtedList = tempSordtedList;
            return true;
        }

You are casting an IEnumerable (result of the Linq query) to an ObservableCollection .

Use this instead:

var col = sordtedList.Where(p => p.firstName.Contains(searchValue));

Since you only use the variable col to iterate over it, you do not need to cast it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM