Śledź stan notatki

W poprzednim kroku naprawiłeś pierwszy ze skutków ubocznych buforowania nawigacji, implementując INotifyPropertyChanged, aby zmiany były widoczne w powiązanej kontrolce tekstowej. Drugi efekt uboczny buforowania strony w nawigacji polega na tym, że kolekcja notatek nie jest aktualizowana po dodaniu lub usunięciu nowej notatki. Wynika to z faktu, że wcześniej notatka została zapisana, a następnie kolekcja została ponownie utworzona przez ponowne odczytanie wszystkich zapisanych notatek. Te problemy rozwiążesz teraz, śledząc stan notatki, a następnie używając stanu w celu ustalenia, czy notatka musi zostać dodana, czy usunięta.

Napiwek

Możesz pobrać lub wyświetlić ukończony kod dla tego samouczka z repozytorium GitHub w sekcji Notatki winUI — część 2. Aby zobaczyć różnice między stanem początkowym i końcowym projektu, zobacz ten commit: aktualizacje do części 2.

Aktualizowanie kolekcji

Najpierw należy dodać kod, aby zaktualizować kolekcję po dodaniu lub usunięciu notatki. W pliku AllNotes.cs dodaj metody AddNote i RemoveNote, jak pokazano tutaj.

    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 spowoduje dodanie notatki na końcu kolekcji. Zamiast tego Insert na początku, aby nowe notatki były wyświetlane jako pierwsze.

Dowiedz się więcej w dokumentacji:

Dodaj status do notatki

Notatki są dodawane lub usuwane w pliku NotePage. Jednak kolekcja notatek jest przechowywana w elemencie AllNotesPage, więc nadal musisz mieć sposób, aby powiadomić AllNotesPage o nowych i usuniętych notatkach. W tym celu dodasz nową State właściwość do Note klasy. Następnie w kroku 3 zmodyfikujesz nawigację między stronami, aby przekazać nowe lub usunięte notatki jako parametr nawigacji.

W pliku Note.cs dodaj nowe wyliczenie o nazwie NoteState. (Dodaj ją poniżej Note klasy, ale wewnątrz nawiasów nazw).

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

Dodaj nową State właściwość do Note klasy i ustaw ją odpowiednio:

  • Unset: Nowa notatka
  • Unsaved: Tekst został zmieniony, ale nie został zapisany.
  • Saved: tekst jest zmieniany i zapisywany w systemie plików.
  • Deleted: Uwaga została usunięta z systemu plików.
// ↓ 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. ↑
}

Należy również ustawić notatkę State , gdy notatki są początkowo ładowane z systemu plików. Domyślnie element State ma wartość Unset, gdy w edytorze zostanie utworzona nowa notatka, ale jeszcze nie zostanie zapisana. Jednak gdy wcześniej zapisana notatka zostanie wczytana z systemu plików, powinna mieć początkową wartość State równą Saved.

W pliku AllNotes.cs znajdź metodę GetFilesInFolderAsync. Następnie zaktualizuj kod, aby utworzyć nowy obiekt Note z początkowym State równym 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. ↑
};