Stav poznámky

V předchozím kroku jste opravili první vedlejší efekt ukládání navigace do mezipaměti implementací INotifyPropertyChanged , aby se úpravy projevily v ovládacím prvku vázaného textu. Druhým vedlejším účinkem ukládání stránky do mezipaměti na navigaci je, že při přidání nebo odstranění nové poznámky se kolekce poznámek neaktualizuje. Je to proto, že dříve se poznámka uložila a pak se kolekce znovu vytvořila opětovným čtením všech uložených poznámek. Tyto problémy teď vyřešíte sledováním stavu poznámky a následným použitím stavu určíte, jestli je potřeba poznámku přidat nebo odstranit.

Tip

Dokončený kód pro tento kurz si můžete stáhnout nebo zobrazit z úložiště GitHub v poznámkách WinUI část 2. Pokud chcete zobrazit rozdíly mezi počátečním a koncovými body projektu, podívejte se na toto potvrzení: aktualizace pro část 2.

Aktualizace kolekce

Nejprve je potřeba přidat kód pro aktualizaci kolekce při přidání nebo odstranění poznámky. V AllNotes.cs přidejte metody AddNote a RemoveNote, jak je znázorněno zde.

    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 by přidal poznámku na konec kolekce. Místo toho jej Insert umístěte na začátek, aby se nové poznámky zobrazovaly jako první.

Další informace najdete v dokumentaci:

Přidejte stav do poznámky

Poznámky jsou přidány nebo odstraněny v NotePage. Ale kolekce poznámek je uchovávána v AllNotesPage, takže stále potřebujete způsob, jak informovat AllNotesPage o nových a odstraněných poznámkách. V takovém případě přidáte do State třídy novou Note vlastnost. Potom v kroku 3 upravíte navigaci mezi stránkami tak, aby jako navigační parametr předaly nové nebo odstraněné poznámky.

V Note.cs přidejte nový výčet s názvem NoteState. (Přidejte ji pod Note třídu, ale do závorek oboru názvů.)

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

Přidejte do State třídy novou Note vlastnost a nastavte ji podle potřeby:

  • Unset: Nová poznámka
  • Unsaved: Text byl změněn, ale nebyl uložen.
  • Saved: Text se změní a uloží do systému souborů.
  • Deleted: Poznámka byla odstraněna ze systému souborů.
// ↓ 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. ↑
}

Poznámka State musí být také nastavena při počátečním načtení poznámek ze systému souborů. Ve výchozím nastavení je StateUnset, když je v editoru vytvořena nová poznámka, ale ještě nebyla uložena. Pokud je však dříve uložená poznámka načtena ze systému souborů, měla by mít iniciály StateSaved.

V AllNotes.cs najděte metodu GetFilesInFolderAsync. Pak aktualizujte kód tak, aby vytvořil nový objekt Note s počáteční hodnotou State nastavenou na 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. ↑
};