Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I föregående steg korrigerade du den första sidoeffekten av cachelagring av navigering genom att implementera INotifyPropertyChanged så att redigeringar återspeglas i den bundna textkontrollen. Den andra bieffekten av att cachelagra sidan i navigeringen är att anteckningssamlingen inte uppdateras när en ny anteckning läggs till eller tas bort. Det beror på att anteckningen sparades tidigare och sedan återskapades samlingen genom att läsa alla sparade anteckningar igen. Du åtgärdar dessa problem nu genom att spåra tillståndet för en anteckning och sedan använda tillståndet för att avgöra om anteckningen behöver läggas till eller tas bort.
Tip
Du kan ladda ned eller visa den färdiga koden för den här självstudien från GitHub-repot med namnet WinUI Notes part 2. Om du vill se skillnaderna mellan projektets start- och slutpunkt, se denna commit: uppdateringar för del 2.
Uppdatera samlingen
Först måste du lägga till kod för att uppdatera samlingen när en anteckning läggs till eller tas bort. I AllNotes.cs lägger du till AddNote- och RemoveNote-metoderna som visas här.
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 skulle lägga till anteckningen i slutet av samlingen.
Insert I stället visas den i början så att nya anteckningar visas först.
Läs mer i dokumenten:
Lägg till status i anteckningen
Anteckningar läggs till eller tas bort i NotePage. Men samlingen med anteckningar finns i AllNotesPage, så du behöver fortfarande ett sätt att informera AllNotesPage om nya anteckningar och borttagna anteckningar. För detta lägger du till en ny State egenskap i Note klassen. I steg 3 ändrar du sedan navigeringen mellan sidorna för att skicka nya eller borttagna anteckningar som navigeringsparameter.
I Note.cs lägger du till en ny enum som heter NoteState. (Lägg till den under Note klassen, men inom namnområdets hakparenteser.)
// ↓ Add this. ↓
public enum NoteState
{
Unset = 0, Unsaved, Saved, Deleted
}
Lägg till en ny State egenskap i Note klassen och ange den efter behov:
-
Unset: Ny anteckning -
Unsaved: Texten har ändrats men inte sparats. -
Saved: Texten ändras och sparas i filsystemet. -
Deleted: Anteckningen har tagits bort från filsystemet.
// ↓ 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. ↑
}
Anteckningen State måste också anges när anteckningarna ursprungligen läses in från filsystemet. Som standard är StateUnset när en ny anteckning har skapats i redigeraren men ännu inte har sparats. Men när en tidigare sparad anteckning läses in från filsystemet bör den ha ett initialt State-värde på Saved.
I AllNotes.cs letar du reda på GetFilesInFolderAsync-metoden. Uppdatera sedan koden för att skapa ett nytt Note objekt med en initial State av 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