这是怎么回事。我有一个视图模型,我在其中调用一个 webclient 并用项目填充一个可观察的集合。我需要在两个不同的页面中有两个不同的列表框,但视图模型中的 ItemsSource 相同。如何限制两个列表框之一中的项目数而不影响另一个?我尝试在创建项目的视图模型中使用 .Take(limit) ,但这会影响两个列表框。
更新
视图模型
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 the dummy data in foreach loop. Just for 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);
}
}
.....................
}
在视图的一侧
public MainPage()
{
InitializeComponent();
DataContext = App.ViewModel;
list.ItemsSource = App.ViewModel.Mainlist.View;
}
更新 2
我发现的另一种选择(不使用CollectionViewSource
)是制作一个新的public ObservableCollection<ItemViewModel> Mainlist { get; private set; }
并再使用一个
foreach (var item in Items.Take(limit))
{
//Items creation
this.Mainlist.Add(new ItemViewModel()
{ LineOne = item });
}
为了填充 ObservableCollection 并将列表框绑定到 Mainlist。这是有效的,但我认为这是不好的做法,因为这样我就有了重复的数据。有什么想法吗?