ノートの状態を追跡する

前の手順では、バインドされたテキスト コントロールに編集が反映されるように、 INotifyPropertyChanged を実装することで、ナビゲーション キャッシュの最初の副作用を修正しました。 ナビゲーションでページをキャッシュするもう 1 つの副作用は、新しいノートが追加または削除されたときにノート コレクションが更新されないということです。 これは、以前はメモが保存され、保存されたすべてのノートを再読み取りしてコレクションが再作成されたためです。 ここで、ノートの状態を追跡し、その状態を使用してメモを追加または削除する必要があるかどうかを判断することで、これらの問題を修正します。

Tip

このチュートリアルの完成したコードは、WinUI Notes パート 2 の GitHub リポジトリからダウンロードまたは表示できます。 プロジェクトの始点と終点の違いを確認するには、パート 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);
        }
    }

Note

Notes.Add は、コレクションの末尾にメモを追加します。 代わりに、先頭に Insert して、新しいノートが最初に表示されるようにします。

詳細については、次のドキュメントを参照してください。

ノートに状態を追加する

ノートは、 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. ↑
};