2009-06-03 7 views
0

J'ai une collection Observable qui est liée à la liste qui contient la date et l'heure. Lorsqu'une heure de la collecte se produit, une boîte de message doit s'afficher.Afficher le message par itération de la collection observable contenant la date et l'heure

je fais comme

public class Reminder 
{ 
    public string Name { get; set; } 
    public string Date { get; set; } 
    public string Time { get; set; } 
} 

ObservableCollection<Reminder> reminderList = new ObservableCollection<Reminder>(); 
Reminder newItem = new Reminder 
            { 
             Name = name, 
             Date = date, 
             Time = time 
            }; 
reminderList.Add(newItem); 

Comment puis-je montrer un message quand un temps dans la collecte se produit?

Répondre

0

Demandez à votre classe de rappel mettre en œuvre INotifyPropertyChanged comme ceci:

public class Reminder : INotifyPropertyChanged 
{ 
    private string time; 

    public string Name { get; set; } 
    public string Date { get; set; } 
    public string Time 
    { 
     get 
     { 
      return this.time; 
     } 
     set 
     { 
      if (this.time != value) 
      { 
       this.time = value; 
       this.OnTimeChanged(); 
      } 
     } 
    } 
    protected void OnTimeChanged() 
    { 
     var handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs("Time")); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 

} 

Ensuite, lorsque vous votre nouveau objet de rappel, crochet dans l'événement PropertyChanged. Si la propriété qui a changé est « Time » et le temps est celui que vous voulez, afficher votre message:

 var newItem = new Reminder 
     { 
      Name = name, 
      Date = date, 
      Time = time 
     }; 
     newItem.PropertyChanged += (o, ex) => 
     { 
      if (ex.PropertyName == "Time" && newItem.Time == specificTime) 
      { 
       //do what you need to do 
      } 
     }; 
     reminderList.Add(newItem); 
+0

Pourriez-vous s'il vous plaît expliquer votre code. Ensuite, je peux comprendre le concept clairement. – Sauron

2

Qu'en est-il de la création d'un objet Timer, et dans son gestionnaire d'événement Tick l'itérer dans la liste pour voir tout ce qui a expiré?

1

La manière la plus simple - démarrer une minuterie, régler pour déclencher chaque minute (ou quelle que soit la fréquence a du sens). Lorsque la minuterie se déclenche, vérifiez tous les éléments de la liste des rappels (en supposant que sa taille est raisonnablement petite) pour les éléments qui devraient afficher une notification.

private void timer1_Tick(object sender, EventArgs e) 
{ 
    var reminders = from item in reminderList 
         where item.Date > DateTime.Now 
         select item; 
    foreach (Reminder reminder in reminders) 
    { 
     reminderList.Remove(reminder); 
     MessageBox.Show("Wake up, " + reminder.Name + "!"); 
    } 
} 

Y at-il une raison que vous avez le temps de rappel stocké sous forme de deux champs de chaîne, plutôt que le seul champ DateTime plus standard? Même si vous contraindre le temps d'affichage des chaînes, assurez-vous de les stocker en interne comme quelque chose de plus raisonnable.

+0

Vous devrez peut-être ajouter quelque chose à utiliser le « item.Time » ainsi;) ... et compense le fait que 'Date' et 'Time' semblent être définis comme des chaînes dans son objet métier. – jerryjvl

+0

@jerryjvl: Oui, je voulais faire un commentaire à ce sujet. Supposons que c'était juste un échantillon, un code jetable. Mieux vaut mettre à jour la réponse juste au cas où. –

Questions connexes