Tenere traccia dello stato della nota

Nel passaggio precedente, hai corretto il primo effetto collaterale della cache di navigazione implementando INotifyPropertyChanged in modo che le modifiche si riflettano nel controllo di testo associato. L'altro effetto collaterale del memorizzare la pagina nella cache durante la navigazione è che la raccolta di note non viene aggiornata quando viene aggiunta o eliminata una nuova nota. Ciò è dovuto al fatto che in precedenza la nota è stata salvata e quindi la raccolta è stata ricreata rileggendo tutte le note salvate. Questi problemi verranno risolti ora monitorando lo stato di una nota, quindi usando lo stato per determinare se la nota deve essere aggiunta o eliminata.

Suggerimento

È possibile scaricare o visualizzare il codice completato di questa esercitazione dal repo GitHub WinUI Notes part 2. Per visualizzare le differenze tra i punti di inizio e di fine per il progetto, vedere questo commit: aggiornamenti per la parte 2.

Aggiornare la raccolta

Prima di tutto, è necessario aggiungere codice per aggiornare la raccolta quando viene aggiunta o eliminata una nota. In AllNotes.cs, aggiungi i metodi AddNote e RemoveNote come illustrato di seguito.

    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 aggiungerebbe la nota alla fine della raccolta. Invece, Insert all'inizio, così le nuove note vengono visualizzate per prime.

Per altre informazioni, vedere la documentazione:

Aggiungi stato alla nota

Le note vengono aggiunte o eliminate in NotePage. Tuttavia, la raccolta di note viene mantenuta in AllNotesPage, quindi è comunque necessario un modo per comunicare AllNotesPage le nuove note e le note eliminate. A questo scopo, si aggiungerà una nuova State proprietà alla Note classe . Quindi, nel passaggio 3, si modificherà lo spostamento tra le pagine per passare note nuove o eliminate come parametro di navigazione.

In Note.csaggiungere una nuova enumerazione denominata NoteState. Aggiungilo sotto la Note class, ma all’interno delle parentesi del namespace.

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

Aggiungere una nuova State proprietà alla classe e impostarla in base alle Note esigenze:

  • Unset: nuova nota
  • Unsaved: il testo è stato modificato, ma non salvato.
  • Saved: il testo viene modificato e salvato nel file system.
  • Deleted: nota eliminata dal file system.
// ↓ 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 nota State deve essere impostata anche quando le note vengono inizialmente caricate dal file system. Per impostazione predefinita, il State è Unset quando viene creata una nuova nota nell'editor ma non è stata salvata. Tuttavia, quando una nota salvata in precedenza viene caricata dal file system, deve avere un valore iniziale State di Saved.

In AllNotes.cs, trova il metodo GetFilesInFolderAsync. Aggiornare quindi il codice per creare un nuovo Note oggetto con un valore iniziale State di Saved.

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. ↑
};