Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De eerste stap is het uitvoeren van de basisconfiguratie voor de wijzigingen die u moet doorvoeren:
- de navigatiecache inschakelen.
- meldingen voor het wijzigen van eigenschappen voor de
Note.Texteigenschap implementeren.
Zodra dat is gebeurd, past u andere onderdelen van de app aan zodat ze met deze wijzigingen werken.
Tip
U kunt de voltooide code voor deze zelfstudie downloaden of bekijken vanuit de GitHub opslagplaats op WinUI Notes deel 2. Als u de verschillen tussen het start- en eindpunt van het project wilt zien, bekijkt u deze commit: updates voor deel 2.
NavigationCacheMode inschakelen
Standaard wordt er een nieuw pagina-exemplaar gemaakt met de standaardwaarden telkens wanneer de navigatie plaatsvindt. In de WinUI Notes-app is dit ook de plek waar de notesModel, waarin alle Note instanties worden opgeslagen, wordt aangemaakt.
Stel AllNotesPage.xamlNavigationCacheMode in op Ingeschakeld (NavigationCacheMode="Enabled"). Als NavigationCacheMode dit is ingeschakeld, wordt hetzelfde pagina-exemplaar bewaard, dus er wordt geen nieuw Page exemplaar gemaakt voor elke navigatie en notesModel wordt niet opnieuw gemaakt.
<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">
Voer de app nu uit en u ziet enkele bijwerkingen van deze wijziging.
- Wanneer u een bestaande notitie bewerkt, worden uw wijzigingen niet weergegeven op de pagina met alle notities wanneer u terug navigeert.
- Wanneer u een nieuwe notitie maakt en opslaat, wordt deze niet weergegeven in de lijst met alle notities wanneer u terug navigeert.
- Wanneer u een bestaande notitie verwijdert, wordt deze niet verwijderd uit de lijst met alle notities wanneer u terug navigeert.
U lost deze problemen vervolgens op.
Meer informatie in de documenten:
- Navigatie tussen twee pagina's implementeren
- Page.NavigationCacheMode-klasse, NavigatieCacheMode enum
INotifyPropertyChanged implementeren
Wanneer u een bestaande notitie bewerkt en opslaat, wordt de wijziging opgeslagen in het bestandssysteem, maar wordt de wijziging niet doorgegeven aan de lijst met alle notities. Dit komt doordat de Note klasse de gegevensbinding, die de TextBoxNote tekst verbindt, niet op de hoogte stelt van een update. Om deze melding mogelijk te maken, moet de klasse Note de interface INotifyPropertyChanged implementeren voor de eigenschap Text.
Note
WinUI bevat de Microsoft.UI.Xaml.Data.INotifyPropertyChanged-interface. Dit wordt alleen gebruikt door C++-apps, die geen gebruik maken van .NET.
C#-apps die met .NET zijn gemaakt, gebruiken in plaats daarvan de interface System.ComponentModel.INotifyPropertyChanged.
De implementatie van INotifyPropertyChanged volgt een vast patroon.
Voeg
using-statements toe voor de vereiste naamruimten.// ↓ Add this. ↓ using System.ComponentModel using System.Runtime.CompilerServicesVoer
INotifyPropertyChangeduit. DeNoteklasse implementeert nu deze interface.// ↓ Update this. ↓ public class Note : INotifyPropertyChangedMaak een back-upveld (
_text) voor deTexteigenschap.// ↓ Delete this. ↓ // public string Text { get; set; } = string.Empty; // ↓ Add this. ↓ private string _text = string.Empty;Wijzig de
Texteigenschap om een getter/setter-patroon te gebruiken met een melding voor eigenschapswijziging.// ↓ Add this. ↓ public string Text { get => _text; set { if (_text != value) { _text = value; OnPropertyChanged(); } } }Voeg de eigenschapswijzigingsgebeurtenis toe die vereist is voor de
INotifyPropertyChangedinterface.// ↓ Add this. ↓ public event PropertyChangedEventHandler? PropertyChanged;Voeg de
OnPropertyChangedmethode toe. Met deze helpermethode wordt dePropertyChangedgebeurtenis gegenereerd met behulp van het kenmerk CallerMemberName voor automatische eigenschapsnaamdetectie.// ↓ Add this. ↓ protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }
Tip
U kunt GitHub Copilot gebruiken om snel te implementeren INotifyPropertyChanged in uw app. Deze codewijzigingen zijn gegenereerd met de prompt: 'Implement INotifyPropertyChanged for the Note.Text property'.
Koppelingsmodus
Nu informeert de eigenschap alle elementen van de Text gebruikersinterface die eraan zijn gebonden wanneer de waarde wordt gewijzigd, zodat uw gebruikersinterface automatisch kan worden bijgewerkt. Als u echter wilt dat de afhankelijke UI-elementen reageren op de updatemelding, moet u ervoor zorgen dat de juiste BindingMode wordt gebruikt.
Important
Het is belangrijk om de juiste BindingMode te kiezen; anders werkt uw gegevensbinding mogelijk niet zoals verwacht. Een veelvoorkomende fout met {x:Bind} is te vergeten de standaardinstelling BindingMode te wijzigen wanneer OneWay of TwoWay nodig is.
| Name | Description |
|---|---|
OneTime |
Werkt de doeleigenschap alleen bij wanneer de binding wordt gemaakt. Standaardwaarde voor {x:Bind}. |
OneWay |
Hiermee werkt u de doeleigenschap bij wanneer de binding wordt gemaakt. Wijzigingen in het bronobject kunnen ook worden doorgegeven aan het doel. |
TwoWay |
Werkt het doel of het bronobject bij wanneer deze wordt gewijzigd. Wanneer de binding wordt gemaakt, wordt de doeleigenschap bijgewerkt vanuit de bron. |
Zoek in AllNotesPage.xaml naar de NoteItemTemplate in Page.Resources. Zoek vervolgens in de sjabloon de TextBlock eigenschap die is gebonden aan de Text eigenschap. Werk de binding bij om de OneWay bindingsmodus te gebruiken.
// ↓ Update this. ↓ ↓ ↓
<TextBlock Text="{x:Bind Text, Mode=OneWay}"
Margin="4" TextWrapping="Wrap"
TextTrimming="WordEllipsis"/>
Omdat de gebruiker de tekst in de TextBlocktekst niet kan bijwerken, is alleen een OneWay binding nodig, van de bron (Note.Text) naar het doel (TextBlock.Text).
Meer informatie in de documenten:
Windows developer