Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
На предыдущем шаге вы исправили первый побочный эффект кэширования навигации, реализовав 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 в начало, чтобы сначала отображались новые заметки.
Дополнительные сведения см. в документации:
- Руководство по приложению «Заметки»: добавление представления и модели для всех заметок
- ObservableCollection
Добавить состояние в примечание
Заметки добавляются или удаляются в 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. ↑
};
Windows developer