Отслеживать состояние заметки

На предыдущем шаге вы исправили первый побочный эффект кэширования навигации, реализовав INotifyPropertyChanged, чтобы изменения отображались в привязанном текстовом элементе управления. Другой побочный эффект кэширования страницы на навигации заключается в том, что коллекция заметок не обновляется при добавлении или удалении новой заметки. Это связано с тем, что ранее заметка была сохранена, а затем коллекция была воссоздана путем повторного чтения всех сохраненных заметок. Теперь вы исправите эти проблемы, отслеживая состояние заметки, а затем используя это состояние, чтобы определить, нужно ли добавить или удалить заметку.

Tip

Вы можете скачать или просмотреть полный код для этого руководства из репозитория GitHub в WinUI Notes часть 2. Чтобы увидеть различия между начальным и конечным состоянием проекта, см. этот коммит: обновления для части 2.

Обновление коллекции

Сначала необходимо добавить код для обновления коллекции при добавлении или удалении заметки. В AllNotes.cs добавьте методы AddNote и RemoveNote, как показано здесь.

    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);
        }
    }

Замечание

Notes.Add добавит заметку в конце коллекции. Вместо этого Insert в начало, чтобы сначала отображались новые заметки.

Дополнительные сведения см. в документации:

Добавить состояние в примечание

Заметки добавляются или удаляются в NotePage. Но коллекция заметок поддерживается в AllNotesPage, поэтому вам по-прежнему нужен способ сообщать AllNotesPage о новых и удалённых заметках. Для этого вы добавите новое State свойство в Note класс. Затем на шаге 3 вы измените навигацию между страницами, чтобы передать новые или удаленные заметки в качестве параметра навигации.

В Note.cs добавьте новое перечисление с именем NoteState. (Добавьте его под Note классом, но внутри квадратных скобок пространства имен.)

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

Добавьте новое State свойство в Note класс и задайте его соответствующим образом:

  • Unset: новая заметка
  • Unsaved: текст изменен, но не сохранен.
  • Saved: текст изменяется и сохраняется в файловой системе.
  • Deleted: примечание было удалено из файловой системы.
// ↓ 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. ↑
}

Заметку State также необходимо задать при первоначальной загрузке заметок из файловой системы. По умолчанию State имеет значение Unset, когда в редакторе создаётся новая заметка, но ещё не сохранена. Однако, при загрузке ранее сохранённой заметки из файловой системы ей должно быть присвоено начальное значение State из Saved.

В AllNotes.cs найдите метод GetFilesInFolderAsync. Затем обновите код, чтобы создать новый объект Note с начальным значением State, равным 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. ↑
};