Suivre l’état d’une note

À l’étape précédente, vous avez résolu le premier effet secondaire de la mise en cache de navigation en implémentant INotifyPropertyChanged afin que les modifications soient reflétées dans le contrôle de texte lié. L’autre effet secondaire de la mise en cache de la page dans la navigation est que la collection de notes n’est pas mise à jour lorsqu’une nouvelle note est ajoutée ou supprimée. C’est parce que précédemment, la note a été enregistrée, puis la collection a été recréée en lisant à nouveau toutes les notes enregistrées. Vous allez résoudre ces problèmes maintenant en suivant l’état d’une note, puis en utilisant l’état pour déterminer si la note doit être ajoutée ou supprimée.

Conseil / Astuce

Vous pouvez télécharger ou afficher le code terminé pour ce didacticiel à partir du dépôt GitHub dans la partie 2 des notes WinUI. Pour voir les différences entre les points de départ et d’arrivée du projet, consultez ce commit : mises à jour pour la partie 2.

Mettre à jour la collection

Tout d’abord, vous devez ajouter du code pour mettre à jour la collection lorsqu’une note est ajoutée ou supprimée. Dans AllNotes.cs, ajoutez les méthodes AddNote et RemoveNote, comme indiqué ici.

    public class AllNotes
    {
        public ObservableCollection<Note> Notes { get; set; } = new ObservableCollection<Note>();
        // ...

        // ↓ Add this. ↓
        public void AddNote(Note note)
        {
            // Insert the note at the beginning of the collection.
            Notes.Insert(0, note);
        }

        public void RemoveNote(Note note)
        {
            Notes.Remove(note);
        }
    }

Note

Notes.Add ajouterait la note à la fin de la collection. À la place, Insert placez-le au début afin que les nouvelles notes s’affichent en premier.

En savoir plus dans la documentation :

Ajouter le statut à la note

Les notes sont ajoutées ou supprimées dans NotePage. Toutefois, la collection de notes est conservée dans AllNotesPage, vous avez donc toujours besoin d’un moyen d’informer AllNotesPage des nouvelles notes et des notes supprimées. Pour cela, vous allez ajouter une nouvelle State propriété à la Note classe. Ensuite, à l’étape 3, vous allez modifier la navigation entre les pages pour passer des notes nouvelles ou supprimées en tant que paramètre de navigation.

Dans Note.cs, ajoutez une nouvelle énumération appelée NoteState. (Ajoutez-le sous la classe Note, mais à l’intérieur des accolades du namespace.)

// ↓ Add this. ↓
public enum NoteState
{
    Unset = 0, Unsaved, Saved, Deleted
}

Ajoutez une nouvelle State propriété à la classe et définissez-la Note comme il convient :

  • Unset: Nouvelle note
  • Unsaved: le texte a été modifié, mais pas enregistré.
  • Saved: le texte est modifié et enregistré dans le système de fichiers.
  • Deleted: Remarque supprimée du système de fichiers.
// ↓ Add this. ↓
public NoteState State { get; set; } = NoteState.Unset;

// ↓ Update these. ↓
public string Text
{
    get => _text;
    set
    {
        if (_text != value)
        {
            _text = value;
            // ↓ Add this. ↓
            State = NoteState.Unsaved;
            // ↑ Add this. ↑
            OnPropertyChanged();
        }
    }
}

public async Task SaveAsync()
{
    // Save the note to a file.
    StorageFile noteFile = (StorageFile)await storageFolder.TryGetItemAsync(Filename);
    if (noteFile is null)
    {
        noteFile = await storageFolder.CreateFileAsync(Filename, CreationCollisionOption.ReplaceExisting);
    }
    await FileIO.WriteTextAsync(noteFile, Text);
    // ↓ Add this. ↓
    State = NoteState.Saved;
    // ↑ Add this. ↑
}

public async Task DeleteAsync()
{
    // Delete the note from the file system.
    StorageFile noteFile = (StorageFile)await storageFolder.TryGetItemAsync(Filename);
    if (noteFile is not null)
    {
        await noteFile.DeleteAsync();
    }
    Filename = string.Empty;
    // ↓ Add this. ↓
    State = NoteState.Deleted;
    // ↑ Add this. ↑
}

La note State doit également être définie lorsque les notes sont initialement chargées à partir du système de fichiers. Par défaut, le State est Unset lorsqu’une nouvelle note est créée dans l’éditeur mais n’a pas encore été enregistrée. Toutefois, lorsqu’une note précédemment enregistrée est chargée à partir du système de fichiers, elle doit avoir une valeur initiale Statede Saved.

Dans AllNotes.cs, recherchez la GetFilesInFolderAsync méthode. Ensuite, mettez le code à jour pour créer un nouvel objet Note avec une valeur initiale de Saved pour State.

Note note = new Note()
{
    Filename = file.Name,
    Text = await FileIO.ReadTextAsync(file),
    Date = file.DateCreated.DateTime, // << Add a comma here.
    // ↓ Add this. ↓
    State = NoteState.Saved
    // ↑ Add this. ↑
};