В общем код 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?
Проблема решилась путем изменения списка. Не надо было создавать новый экземпляр 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 });
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Каким образом можно обновить данные в radGridView, при передачи отредактированного объекта в radGridViewDataSource = editedOject?
сделал программу бинарного поиска через цикл итерациями, как я понял можно ускорить поиск если внести некоторые изменения В коде выделил...
Как при передачи объекта в dataGridView, найти нужную строку и обновить ее не затрагивая остальные строкиЯ делаю вот так: dataGridView