Reputation: 59
I have a List with a string countdown and I want to update it with a DispatcherTimer every second.
Init (runs on windows loads)
tasks.Add(new Tasks()
{
title = "Task 1",
date = "14:30 17 Martie 2016",
countdown = "1",
timer = new TimeSpan(0, 15, 32)
});
tasks.Add(new Tasks()
{
title = "Task 2",
date = "14:30 17 Martie 2016",
countdown = "2",
timer = new TimeSpan(1, 10, 52)
});
listViewTasks.ItemsSource = tasks;
initCountdown();
Class
public class Tasks
{
public string title { get; set; }
public string date { get; set; }
public string countdown { get; set; }
public TimeSpan timer { get; set; }
}
DispatcherTimer
public void initCountdown()
{
string item = tasks[0].title;
_time = tasks[0].timer;
_timer = new DispatcherTimer(new TimeSpan(0, 0, 1), DispatcherPriority.Normal, delegate
{
tasks[0].countdown = _time.ToString("c"); //this does not update
if (_time == TimeSpan.Zero) _timer.Stop();
_time = _time.Add(TimeSpan.FromSeconds(-1));
}, Application.Current.Dispatcher);
_timer.Start();
}
XAML
<ListView Margin="0,30,0,0" Name="listViewTasks">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<StackPanel HorizontalAlignment="Left" Margin="0,0,50,0">
<TextBlock Text="{Binding title}" Cursor="Hand"/>
<TextBlock Text="{Binding date}" />
</StackPanel>
<StackPanel HorizontalAlignment="Right" Grid.Column="1">
<TextBlock Text="{Binding countdown}" />
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
from outside the dispatcher I can update it but from inside is not working.
No exception and the ui does NOT update
I want to update the listview to show me the countdown from the timespan I add.
Upvotes: 1
Views: 341
Reputation: 2859
Change your Tasks
class to implement the INotifyPropertyChanged
interface. The value of countdown is being updated, the UI just doesn't get notified of it's new value.
public class Tasks : INotifyPropertyChanged
{
private string _title;
public string title
{
get { return _title; }
set { _title = value; OnPropertyChanged("title"); }
}
private string _date;
public string date
{
get { return _date; }
set { _date = value; OnPropertyChanged("date"); }
}
private string _countdown;
public string countdown
{
get { return _countdown; }
set { _countdown = value; OnPropertyChanged("countdown"); }
}
private TimeSpan _timer;
public TimeSpan timer
{
get { return _timer; }
set { _timer = value; OnPropertyChanged("timer"); }
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propName)
{
var e = PropertyChanged;
if (e != null)
{
e.Invoke(this, new PropertyChangedEventArgs(propName));
}
}
}
Upvotes: 1
Reputation: 27360
You have to implement INotifyPropertyChanged interface in your Tasks class and call the PropertyChanged event when countdown property changes
Upvotes: 3