c# - How to limit the number of items from an observablecollection databinded listbox? -


here how goes. have viewmodel call webclient , populate observable collection items. need have 2 different listboxes in 2 different pages same itemssource viewmodel. how can limit number of items in 1 of 2 listboxes without affect other? tried use .take(limit) viewmodel items being created affects both listboxes.

update

the viewmodel

public class mainviewmodel : inotifypropertychanged { public mainviewmodel() { this.items = new observablecollection<itemviewmodel>(); this.mainlist = new collectionviewsource(); } public observablecollection<itemviewmodel> items { get; private set; } public collectionviewsource mainlist { get; set; } void client_downloadstringcompleted(object sender, downloadstringcompletedeventargs e) { try { ............... //ignore dummy data in foreach loop. showcase. foreach (var item in items) { //items creation this.items.add(new itemviewmodel() { lineone = item }); } this.mainlist.source = app.viewmodel.items; this.mainlist.filter += (s, a) => a.accepted = app.viewmodel.items.indexof((itemviewmodel)a.item) < 10; } catch (exception ex) { messagebox.show(ex.message); } } ..................... } 

on view's side

 public mainpage() { initializecomponent(); datacontext = app.viewmodel; list.itemssource = app.viewmodel.mainlist.view; } 

update 2

another option found (without using collectionviewsource) make new public observablecollection<itemviewmodel> mainlist { get; private set; } , use 1 more

 foreach (var item in items.take(limit)) { //items creation this.mainlist.add(new itemviewmodel() { lineone = item }); } 

in order populate observablecollection , bind listbox mainlist. working think poor practice because in way have duplicated data. ideas on that?

you use collectionviewsource , add filtering logic limit number of items shown. example, if wanted show 100 items:

var cvs = new collectionviewsource(); cvs.source = mylist; //the raw list viewmodel cvs.filter += (s, a) => a.accepted = mylist.indexof(a.item) < 100; listbox2.itemssource = cvs.view; 

edit: based on posted code

when set mainlist.source, changes mainlist.view well. setting list.itemssource in mainpage constructor useless (besides, view property null @ time anyway). in order fix issue, should move these following lines mainviewmodel constructor:

this.mainlist.source = app.viewmodel.items; this.mainlist.filter += (s, a) => a.accepted = app.viewmodel.items.indexof((itemviewmodel)a.item) < 10; 

that way, set source once, , view doesn't change.


Comments

Popular posts from this blog

javascript - backbone.js Collection.add() doesn't `construct` (`initialize`) an object -

php - Get uncommon values from two or more arrays -

Adding duplicate array rows in Php -