Как обновить один элемент ListView(ListBox) а не всю коллекцию

123
22 февраля 2022, 03:00

В общем код Xaml на элемент ListView

<ListView ItemsSource="{Binding Episode, UpdateSourceTrigger=PropertyChanged}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid Margin="0">
                <ProgressBar Value="{Binding Completion}" />
                <TextBlock Text="{Binding Title}" />
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

ViewModel Base

public class ViewModelBase : INotifyPropertyChanged
{
    #region Property Changed Event Handler        
    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion Property Changed Event Handler
}

RootViewModel

public class RootViewModel : ViewModelBase
{
    public class Video_Progress
    {
        public string Title { get; set; }
        public double Completion { get; set; }
    }
    ObservableCollection<Video_Progress> m_Episode;
    public ObservableCollection<Video_Progress> Episode
    {
        get
        {
            return m_Episode;
        }
        set
        {
            m_Episode = value;
            RaisePropertyChanged(nameof(Episode));
        }
    }
}

Собственно приложение выглядит вот так :

С некоторой периодичностю я записываю данные в LocalBD о позиции видео. И потом его считываю, чтобы динамически отображались данные ProgressBar на каком месте остановился. И вызываю метод:

public void List_Box_Episode()
    {
        var ViewModel = App.ViewModel as RootViewModel;
        double com = 0;
        Task.Run(() =>
        {
            episode = new ObservableCollection<Video_Progress>();
            foreach (var pars in playlist_balancer.Translator[id_translate].Seasons[id_season].Episode)
            {
                com = LocalDB.Video_Completion();
                com = Math.Round(com);
                episode.Add(new Video_Progress { Title = pars.nubmer_episode, Completion = com });
            }
            ViewModel.Episode = episode;
        });

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

Вот как сделать так, чтоб обновлялась не вся коллекция, а только выбранный элемент? Конкретно ProgressBar?

Answer 1

Проблема решилась путем изменения списка. Не надо было создавать новый экземпляр ObservableCollection. А просто его изменить. С учетом того, что список не изменяется в потоке отличном от Dispatcher. Меняем элемент списка по индексу в основном потоке.

    public void List_Box_Episode_test()
    {
        var view = App.ViewModel as RootViewModel;
        int ep = view.now_Episode;
        var ep_n = view.now_Balancer;
        Dispatcher.CurrentDispatcher.Invoke(() => episode[ep] = new Video_Progress { Completion = view.new_Position, Title = ep_n.nubmer_episode });
    }
READ ALSO
ZipFile c# trouble

ZipFile c# trouble

Ошибка - Не удается найти конец записи главного каталогаПри таком коде:

106
RadGridView (Telerik) обновление данных

RadGridView (Telerik) обновление данных

Каким образом можно обновить данные в radGridView, при передачи отредактированного объекта в radGridViewDataSource = editedOject?

75
Бинарный поиск итеративным методом

Бинарный поиск итеративным методом

сделал программу бинарного поиска через цикл итерациями, как я понял можно ускорить поиск если внести некоторые изменения В коде выделил...

83
DataGridView поиск и обновление данных

DataGridView поиск и обновление данных

Как при передачи объекта в dataGridView, найти нужную строку и обновить ее не затрагивая остальные строкиЯ делаю вот так: dataGridView

102