Estado da nota da pista

No passo anterior, corrigiu o primeiro efeito colateral da colocação em cache da navegação implementando INotifyPropertyChanged, de forma que as edições sejam refletidas no controlo de texto associado. Outro efeito secundário de guardar a página em cache na navegação é que a coleção de notas não é atualizada quando uma nova nota é adicionada ou eliminada. Isto porque anteriormente a nota estava guardada, e depois a coleção era recriada relendo todas as notas guardadas. Agora vais resolver estes problemas acompanhando o estado de uma nota e depois usando esse estado para determinar se a nota precisa de ser adicionada ou eliminada.

Sugestão

Pode descarregar ou ver o código completo deste tutorial no repositório do GitHub em WinUI Notes parte 2. Para ver as diferenças entre os pontos inicial e final do projeto, consulte este commit: atualizações para a parte 2.

Atualizar a coleção

Primeiro, precisa de adicionar código para atualizar a coleção quando uma nota é adicionada ou eliminada. Em AllNotes.cs, adicione os AddNote métodos e RemoveNote como mostrado aqui.

    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 Adicionaria a nota no final da coleção. Em vez disso, Insert está no início para que as novas notas sejam mostradas primeiro.

Saiba mais nos documentos:

Adicionar Estado à nota

As notas são adicionadas ou eliminadas em NotePage. Mas a coleção de notas mantém-se em AllNotesPage, por isso ainda precisas de uma forma de informar AllNotesPage sobre novas notas e notas eliminadas. Para isso, vais adicionar uma nova State propriedade à Note classe. Depois, no passo 3, vais modificar a navegação entre as páginas para passar notas novas ou eliminadas como parâmetro de navegação.

Em Note.cs, adicione um novo enum chamado NoteState. (Adicione-o abaixo da Note classe, mas dentro dos parênteses do namespace.)

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

Adicione uma nova State propriedade à Note classe e defina-a conforme apropriado:

  • Unset: Nova nota
  • Unsaved: O texto foi alterado, mas não guardado.
  • Saved: O texto é alterado e guardado no sistema de ficheiros.
  • Deleted: A nota foi apagada do sistema de ficheiros.
// ↓ 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 nota State também precisa de ser definida quando as notas são inicialmente carregadas a partir do sistema de ficheiros. Por defeito, o State está Unset quando é criada uma nova nota no editor, mas esta ainda não foi guardada. No entanto, quando uma nota previamente guardada é carregada a partir do sistema de ficheiros, deve ter uma inicial State de Saved.

Em AllNotes.cs, localize o método GetFilesInFolderAsync. Depois, atualize o código para criar um novo Note objeto com uma inicial State de 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. ↑
};