Navigációs gyorsítótár és változásértesítés

Az első lépés az alapbeállítás elvégzése a szükséges módosításokhoz:

  • engedélyezze a navigációs gyorsítótárat.
  • a(z) Note.Text tulajdonság tulajdonságváltozási értesítéseinek megvalósítása.

Ha elkészült, az alkalmazás más részeit is át kell alakítania a módosítások kezeléséhez.

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 lásd ezt a commitot: frissítések a 2. részhez.

NavigationCacheMode engedélyezése

Alapértelmezés szerint egy új lappéldány jön létre az alapértelmezett értékekkel minden egyes navigáláskor. A WinUI Notes alkalmazásban itt hozzák létre a notesModel-t is, amely az összes Note-példányt tárolja.

A(z) AllNotesPage.xaml területen állítsa a(z) NavigationCacheMode értékét Enabled értékűre (NavigationCacheMode="Enabled"). Ha NavigationCacheMode engedélyezve van, ugyanaz a lappéldány megmarad, így nem jön létre új Page példány az egyes navigációs sávokon, és notesModel nem jön létre újra.

<Page
    x:Class="WinUI_Notes.Views.AllNotesPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:WinUI_Notes.Views"
    xmlns:models="using:WinUI_Notes.Models"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    //  ↓ Add this. ↓
    NavigationCacheMode="Enabled">

Futtassa most az alkalmazást, és látni fogja a változás néhány mellékhatását.

  1. Egy meglévő jegyzet szerkesztésekor a módosítások nem jelennek meg a minden jegyzet lapon, amikor visszalépést hajt végre.
  2. Amikor létrehoz és elment egy új jegyzetet, az nem jelenik meg az összes jegyzet listájában, miután visszalép.
  3. Ha töröl egy meglévő jegyzetet, az nem lesz eltávolítva a minden jegyzet listából, amikor vissza lép.

Ezeket a problémákat a következő lépésben fogja kijavítani.

További információ a dokumentumokban:

Az INotifyPropertyChanged implementálása

Meglévő jegyzet szerkesztésekor és mentésekor a rendszer menti a módosítást a fájlrendszerbe, de a módosítás nem lesz propagálása a teljes jegyzetlistára. Ennek az az oka, hogy az Note osztály nem értesíti a szöveghez TextBox csatlakozó Note adatkötést arról, hogy frissítés történt. Ahhoz, hogy ez az értesítés megtörténjen, a Note osztálynak implementálnia kell a INotifyPropertyChanged interfészt a Text tulajdonságához.

Note

A WinUI tartalmazza a Microsoft.UI.Xaml.Data.INotifyPropertyChanged interfészt. Ezt csak a C++ alkalmazások használják, amelyek nem használják .NET.

A .NET létrehozott C#-alkalmazások ehelyett a System.ComponentModel.INotifyPropertyChanged felületet használják.

A(z) INotifyPropertyChanged megvalósítása egy meghatározott mintát követ.

  1. Adjon meg using utasításokat a szükséges névterekhez.

    // ↓ Add this. ↓
    using System.ComponentModel
    using System.Runtime.CompilerServices
    
  2. Implementálás INotifyPropertyChanged. Az Note osztály most implementálja ezt a felületet.

    // ↓ Update this. ↓
    public class Note : INotifyPropertyChanged
    
  3. Hozzon létre egy háttérmezőt (_text) a Text tulajdonsághoz.

    // ↓ Delete this. ↓
    // public string Text { get; set; } = string.Empty;
    
    // ↓ Add this. ↓
    private string _text = string.Empty;
    
  4. Módosítsa a tulajdonságot Text úgy, hogy egy getter/setter mintát használjon a tulajdonságmódosítási értesítéssel.

    // ↓ Add this. ↓
    public string Text
    {
        get => _text;
        set
        {
            if (_text != value)
            {
                _text = value;
                OnPropertyChanged();
            }
        }
    }
    
  5. Adja hozzá a felület által igényelt PropertyChanged eseményt INotifyPropertyChanged .

    // ↓ Add this. ↓
    public event PropertyChangedEventHandler? PropertyChanged;
    
  6. Adja hozzá a metódust OnPropertyChanged . Ez a segédmetódus a PropertyChanged attribútummal indítja el az eseményt az automatikus tulajdonságnév-észleléshez.

    // ↓ Add this. ↓
    protected void OnPropertyChanged([CallerMemberName] string? propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    

Tip

A GitHub Copilot használatával gyorsan implementálhatja INotifyPropertyChanged az alkalmazást. Ezek a kódmódosítások a következő paranccsal készültek: "Valósítsd meg az INotifyPropertyChanged funkciót a Note.Text tulajdonsághoz".

Kötési mód

Most a tulajdonság értesíti a Text hozzá tartozó felhasználói felületi elemeket, amikor az értéke megváltozik, így a felhasználói felület automatikusan frissíthető. Ahhoz azonban, hogy a kötött felhasználói felület elemei reagáljanak a frissítési értesítésre, meg kell győződnie arról, hogy a megfelelő BindingMode van használatban.

Important

Fontos a megfelelő BindingMode kiválasztása; ellenkező esetben előfordulhat, hogy az adatkötés nem a várt módon működik. (Gyakori hiba {x:Bind} esetén, ha elfelejtjük módosítani az alapértelmezett BindingMode-t, amikor OneWay vagy TwoWay szükséges.)

Name Description
OneTime A céltulajdonság csak a kötés létrehozásakor frissül. Alapértelmezett beállítás a következőhöz {x:Bind}: .
OneWay Frissíti a céltulajdonságot a kötés létrehozásakor. A forrásobjektum módosításai a célra is terjedhetnek.
TwoWay Bármelyik módosításkor frissíti a célt vagy a forrásobjektumot. A kötés létrehozásakor a céltulajdonság frissül a forrásból.

A(z) AllNotesPage.xaml területen keresse meg a(z) NoteItemTemplate elemet a(z) Page.Resources részben. Ezután a sablonban keresse meg a(z) TextBlock elemet, amely a Text tulajdonsághoz van kötve. Frissítse a kötést a OneWay kötési mód használatára.

// ↓ Update this. ↓              ↓    ↓
<TextBlock Text="{x:Bind Text, Mode=OneWay}"
           Margin="4" TextWrapping="Wrap"
           TextTrimming="WordEllipsis"/>

Mivel a felhasználó nem tudja frissíteni a szöveget a TextBlock elemben, csak egy OneWay kötésre van szükség, a forrásból (Note.Text) a célba (TextBlock.Text).

További információ a dokumentumokban: