Jegyzet állapotának nyomon követése

Az előző lépésben az INotifyPropertyChanged megvalósításával kijavította a navigációs gyorsítótárazás első mellékhatását, hogy a módosítások tükröződjenek a kötött szövegvezérlőben. A lap navigációs gyorsítótárazásának másik mellékhatása, hogy a jegyzetgyűjtemény nem frissül új jegyzet hozzáadásakor vagy törlésekor. Ez azért van, mert korábban elmentették a jegyzetet, majd a gyűjteményt az összes mentett jegyzet újbóli beolvasásával újralétrehozták. Ezeket a problémákat most egy jegyzet állapotának nyomon követésével oldhatja meg, majd az állapot használatával állapíthatja meg, hogy hozzá kell-e adni vagy törölni kell-e a jegyzetet.

Tip

Az oktatóanyag befejezett kódját a WinUI Notes 2. részében található GitHub adattárból töltheti le vagy tekintheti meg. A projekt kezdeti és végső állapota közötti különbségek megtekintéséhez tekintse meg ezt a commitot: 2. rész frissítései.

A gyűjtemény frissítése

Először fel kell vennie a kódot a gyűjtemény frissítéséhez egy jegyzet hozzáadásakor vagy törlésekor. A(z) AllNotes.cs elemhez adja hozzá a AddNote és RemoveNote metódusokat az itt látható módon.

    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 hozzáadná a megjegyzést a gyűjtemény végéhez. Ehelyett helyezze Insert az elejére, hogy az új jegyzetek jelenjenek meg először.

További információ a dokumentumokban:

Állapot hozzáadása a jegyzethez

A jegyzeteket a program hozzáadja vagy törli a fájlból NotePage. A jegyzetek gyűjteménye azonban a(z) AllNotesPage elemben van tárolva, így továbbra is szükség van egy módra, hogy értesítse a(z) AllNotesPage elemet az új és a törölt jegyzetekről. Ehhez hozzáad egy új State tulajdonságot a(z) Note osztályhoz. Ezután a 3. lépésben módosítja a lapok közötti navigációt, hogy új vagy törölt jegyzeteket adjon át navigációs paraméterként.

A(z) Note.cs elemben adjon hozzá egy új, NoteState nevű enumerálástípust. (Adja hozzá az Note osztály alá, de a névtér zárójelei közé.)

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

Adjon hozzá egy új State tulajdonságot az Note osztályhoz, és állítsa be a megfelelő módon:

  • Unset: Új megjegyzés
  • Unsaved: A szöveg megváltozott, de nincs mentve.
  • Saved: A rendszer módosítja és menti a szöveget a fájlrendszerbe.
  • Deleted: A megjegyzés törölve lett a fájlrendszerből.
// ↓ 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. ↑
}

A jegyzetet State akkor is be kell állítani, amikor a jegyzeteket először betöltik a fájlrendszerből. Alapértelmezés szerint a(z) StateUnset, amikor új jegyzetet hoznak létre a szerkesztőben, de az még nincs mentve. Ha azonban egy korábban mentett jegyzetet tölt be a fájlrendszerből, annak a kezdőbetűjének StateSavedkell lennie.

A(z) AllNotes.cs elemben keresse meg a(z) GetFilesInFolderAsync metódust. Ezután frissítse a kódot úgy, hogy hozzon létre egy új Note objektumot, amelynek a kezdeti State értéke 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. ↑
};