Notizstatus nachverfolgen

Im vorherigen Schritt haben Sie die erste Auswirkung des Navigationszwischenspeicherns behoben, indem Sie INotifyPropertyChanged implementiert haben, sodass Bearbeitungen im gebundenen Textsteuerelement übernommen werden. Der andere Nebeneffekt des Zwischenspeicherns der Seite bei der Navigation besteht darin, dass die Notizensammlung nicht aktualisiert wird, wenn eine neue Notiz hinzugefügt oder gelöscht wird. Das liegt daran, dass die Notiz zuvor gespeichert wurde und dann die Sammlung neu erstellt wurde, indem alle gespeicherten Notizen erneut gelesen wurden. Sie beheben diese Probleme jetzt, indem Sie den Status einer Notiz nachverfolgen und dann den Status verwenden, um zu bestimmen, ob die Notiz hinzugefügt oder gelöscht werden muss.

Tip

Sie können den vollständigen Code für dieses Lernprogramm aus dem GitHub-Repository unter WinUI Notes Teil 2 herunterladen oder anzeigen. Informationen zu den Unterschieden zwischen den Anfangs- und Endpunkten für das Projekt finden Sie unter diesem Commit: Updates für Teil 2.

Aktualisieren der Sammlung

Zuerst müssen Sie Code hinzufügen, um die Sammlung zu aktualisieren, wenn eine Notiz hinzugefügt oder gelöscht wird. Fügen Sie in AllNotes.cs die Methoden AddNote und RemoveNote hinzu, wie hier gezeigt.

    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 würde die Notiz am Ende der Sammlung anfügen. Setzen Sie es stattdessen Insert an den Anfang, damit neue Notizen zuerst angezeigt werden.

Weitere Informationen finden Sie in den Dokumenten:

Status zur Notiz hinzufügen

Notizen werden hinzugefügt oder gelöscht in NotePage. Die Sammlung von Notizen wird jedoch in AllNotesPage verwaltet, daher brauchen Sie weiterhin eine Möglichkeit, AllNotesPage über neue und gelöschte Notizen zu informieren. Hierfür fügen Sie der State Klasse eine neue Note Eigenschaft hinzu. Anschließend ändern Sie in Schritt 3 die Navigation zwischen den Seiten, um neue oder gelöschte Notizen als Navigationsparameter zu übergeben.

Fügen Sie in Note.cs ein neues Enum namens NoteState hinzu. (Fügen Sie sie unterhalb der Note Klasse hinzu, aber innerhalb der Namespaceklammern.)

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

Fügen Sie der State Klasse eine neue Note Eigenschaft hinzu, und legen Sie sie entsprechend fest:

  • Unset: Neue Notiz
  • Unsaved: Text wurde geändert, aber nicht gespeichert.
  • Saved: Text wird geändert und im Dateisystem gespeichert.
  • Deleted: Hinweis wurde aus dem Dateisystem gelöscht.
// ↓ 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. ↑
}

Die Notiz State muss auch festgelegt werden, wenn die Notizen anfänglich aus dem Dateisystem geladen werden. Standardmäßig ist das StateUnset, wenn im Editor eine neue Notiz erstellt wurde, aber noch nicht gespeichert ist. Wird jedoch eine zuvor gespeicherte Notiz aus dem Dateisystem geladen, sollte ihr Anfangswert State statt Saved lauten.

Suchen Sie in AllNotes.cs die Methode GetFilesInFolderAsync. Aktualisieren Sie dann den Code, um ein neues Note-Objekt mit einem anfänglichen State von Saved zu erstellen.

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