Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.Texttulajdonsá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.
- 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.
- Amikor létrehoz és elment egy új jegyzetet, az nem jelenik meg az összes jegyzet listájában, miután visszalép.
- 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:
- Navigáció megvalósítása két oldal között
- Page.NavigationCacheMode osztály, NavigationCacheMode enumerálás
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.
Adjon meg
usingutasításokat a szükséges névterekhez.// ↓ Add this. ↓ using System.ComponentModel using System.Runtime.CompilerServicesImplementálás
INotifyPropertyChanged. AzNoteosztály most implementálja ezt a felületet.// ↓ Update this. ↓ public class Note : INotifyPropertyChangedHozzon létre egy háttérmezőt (
_text) aTexttulajdonsághoz.// ↓ Delete this. ↓ // public string Text { get; set; } = string.Empty; // ↓ Add this. ↓ private string _text = string.Empty;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(); } } }Adja hozzá a felület által igényelt PropertyChanged eseményt
INotifyPropertyChanged.// ↓ Add this. ↓ public event PropertyChangedEventHandler? PropertyChanged;Adja hozzá a metódust
OnPropertyChanged. Ez a segédmetódus aPropertyChangedattribú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:
Windows developer