Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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. ↑
};