2016-05-16 4 views
1

Ich habe eine Liste mit einem Countdown und ich möchte es jede Sekunde mit einem DispatcherTimer aktualisieren.Liste <> aktualisiert nicht in DispatcherTimer

Init (läuft auf Windows-Lasten)

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(); 

Klasse

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> 

von außerhalb des Dispatcher kann ich es aktualisieren, aber von innen funktioniert nicht.

keine Ausnahme und die ui NICHT

Ich möchte aktualisieren, um die Listenansicht mich aus der Zeitspanne um den Countdown zu zeigen, nicht aktualisiert ich hinzufügen.

+0

Erhalten Sie eine Ausnahme? Oder wird es einfach nicht aktualisiert? – Zack

+0

Was bedeutet "funktioniert nicht"? Es erreicht nie Null, oder die UI wird nicht aktualisiert? – Liero

+0

@Zack keine Ausnahme – user2252671

Antwort

3

Sie müssen INotifyPropertyChanged-Schnittstelle in Ihre Aufgaben Klasse implementieren und das Property Ereignis aufrufen, wenn Countdown Eigenschaft ändert

+0

danke, es ist genau das, was ich brauchte – user2252671

1

Ihre Tasks Klasse Ändern Sie die INotifyPropertyChanged Schnittstelle zu implementieren. Der Wert des Countdowns wird aktualisiert, die Benutzeroberfläche wird jedoch nicht über den neuen Wert benachrichtigt.

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)); 
     } 
    } 
} 
Verwandte Themen