Nano Hash - криптовалюты, майнинг, программирование

Как ограничить количество элементов из списка с привязкой к наблюдаемым данным?

Вот как это происходит. У меня есть модель представления, в которой я вызываю веб-клиент и заполняю наблюдаемую коллекцию элементами. Мне нужно иметь два разных списка на двух разных страницах, но с одним и тем же 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. Это работает, но я также думаю, что это плохая практика, потому что таким образом я дублирую данные. Любые идеи по этому поводу?


Ответы:


1

Вы можете использовать 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. Таким образом, установка list.ItemsSource в конструкторе MainPage бесполезна (кроме того, свойство 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 не меняется.

07.07.2012
  • Спасибо @Eren, но в моем случае myList — это App.ViewModel.Items, который является наблюдаемой коллекцией, поэтому я получаю сообщение об ошибке в выражении IndeOf. 07.07.2012
  • Это должно быть хорошо, так как ObservableCollection имеет метод IndexOf. В чем ошибка? 07.07.2012
  • Ошибка: аргумент 1: невозможно преобразовать из «объекта» в «ItemViewModel». 07.07.2012
  • Я понимаю. Попробуйте myList.IndexOf((ItemViewModel)a.Item). 07.07.2012
  • Я только что обновил свой первый пост с некоторым кодом. Я попытался создать новое свойство, в котором я могу хранить эти элементы и привязываться к ним из представления. Пожалуйста, взгляните. 07.07.2012
  • Хм, я тоже пробовал таким образом (переместите этот фрагмент в конструктор модели представления), но приложение неожиданно вылетает. Пробовал отлаживать, похоже проблема в строке this.Mainlist.Source = App.ViewModel.Items; Какие-либо предложения? 08.07.2012

  • 2

    Я, вероятно, упростил бы это и направился больше в направлении вашего первоначального подхода, делая что-то вроде:

    public MainViewModel()
    {
        _items = new ObservableCollection<ItemViewModel>();
    }
    
    public ObservableCollection<ItemViewModel> Items { 
        get {return _items;} 
        private set {_items = value;} 
    }
    private ObservableCollection<ItemViewModel> _items;
    
    private int _items_to_show_on_second_list = 10;
    
    public ObservableCollection<ItemViewModel> ItemsLimit { 
        get {return _items.Take(_items_to_show_on_second_list);} 
        private set {_items = value;} 
    }
    

    Обратите внимание, что вы можете не захотеть ничего устанавливать во второй наблюдаемой коллекции, на ваше усмотрение.

    Преимущество заключается в том, что вы не меняете свою логику, вы по-прежнему можете иметь читаемый код (используя Take() и осмысленное имя переменной, чтобы избежать magic number, которым в конечном итоге будут злоупотреблять.

    25.08.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..