gpt4 book ai didi

c# - 如何限制 observablecollection 数据绑定(bind)列表框中的项目数量?

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:58 26 4
gpt4 key购买 nike

事情是这样的。我有一个 viewmodel,我在其中调用 webclient 并用项目填充可观察的集合。我需要在两个不同的页面中有两个不同的列表框,但 View 模型中的 ItemsSource 相同。如何在不影响另一个列表框的情况下限制两个列表框之一中的项目数?我尝试在创建项目的 View 模型中使用 .Take(limit) 但这会影响两个列表框。

更新

View 模型

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);
}

}

.....................
}

在 View 方面

    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 并将列表框绑定(bind)到 Mainlist。这是可行的,但我也认为这是不好的做法,因为那样我就有了重复的数据。有什么想法吗?

最佳答案

你可以使用 CollectionViewSource并添加过滤逻辑以限制显示的项目数。例如,如果您只想显示 100 个项目:

var cvs = new CollectionViewSource();
cvs.Source = myList; //the raw list from the viewmodel
cvs.Filter += (s, a) => a.Accepted = myList.IndexOf(a.Item) < 100;
listBox2.ItemsSource = cvs.View;

编辑:基于发布的代码

当您设置 Mainlist.Source 时,也会更改 Mainlist.View。所以在 MainPage 构造函数中设置 list.ItemsSource 是没有用的(此外,View 属性很可能是 null无论如何在那个时候)。为了解决您的问题,您应该将以下几行移动到 MainViewModel 构造函数中:

this.Mainlist.Source = App.ViewModel.Items;
this.Mainlist.Filter += (s, a) =>
a.Accepted = App.ViewModel.Items.IndexOf((ItemViewModel)a.Item) < 10;

这样,您只需设置一次Source,而View 不会改变。

关于c# - 如何限制 observablecollection 数据绑定(bind)列表框中的项目数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11375543/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com