user2252671
user2252671

Reputation: 59

List<> does not update in DispatcherTimer

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

Answers (2)

Zack
Zack

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

Liero
Liero

Reputation: 27360

You have to implement INotifyPropertyChanged interface in your Tasks class and call the PropertyChanged event when countdown property changes

Upvotes: 3

Related Questions