Navigationscache und Änderungsbenachrichtigung

Der erste Schritt besteht darin, das grundlegende Setup für die Änderungen auszuführen, die Sie vornehmen müssen:

  • aktivieren Sie den Navigationscache.
  • Implementieren von Eigenschaftsänderungsbenachrichtigungen für die Note.Text Eigenschaft.

Sobald das erledigt ist, passen Sie andere Teile der App an diese Änderungen an.

Tip

Sie können den vollständigen Code für dieses Lernprogramm aus dem GitHub-Repository unter WinUI Notes Teil 2 herunterladen oder anzeigen. Informationen zu den Unterschieden zwischen den Anfangs- und Endpunkten für das Projekt finden Sie unter diesem Commit: Updates für Teil 2.

NavigationCacheMode aktivieren

Standardmäßig wird bei jeder Navigation eine neue Page-Instanz mit ihren Standardwerten erstellt. In der WinUI Notes-App wird hier auch die notesModelInstanz erstellt, die alle Note Instanzen speichert.

Legen Sie in AllNotesPage.xaml, NavigationCacheMode auf Enabled () festNavigationCacheMode="Enabled". Wenn NavigationCacheMode aktiviert ist, wird dieselbe Seiteninstanz beibehalten, sodass bei jeder Navigation keine neue Page-Instanz erstellt wird und notesModel nicht neu erstellt wird.

<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">

Führen Sie die App jetzt aus, und Sie werden einige Nebenwirkungen dieser Änderung bemerken.

  1. Wenn Sie eine vorhandene Notiz bearbeiten, werden Ihre Änderungen nicht auf der Seite "Alle Notizen" angezeigt, wenn Sie zurück navigieren.
  2. Wenn Sie eine neue Notiz erstellen und speichern, wird sie nicht in der Liste mit allen Notizen angezeigt, wenn Sie zurück navigieren.
  3. Wenn Sie eine vorhandene Notiz löschen, wird sie nicht aus der Liste mit allen Notizen entfernt, wenn Sie zurück navigieren.

Im nächsten Schritt beheben Sie diese Probleme.

Weitere Informationen finden Sie in den Dokumenten:

Implementieren von INotifyPropertyChanged

Wenn Sie eine vorhandene Notiz bearbeiten und speichern, wird Ihre Änderung im Dateisystem gespeichert, die Änderung wird jedoch nicht an die Liste mit allen Notizen weitergegeben. Dies liegt daran, dass die Note Klasse die Datenbindung nicht benachrichtigt, die eine TextBox Verbindung mit dem Note Text herstellt, dass eine Aktualisierung erfolgt ist. Damit diese Benachrichtigung erfolgt, muss die Note Klasse die INotifyPropertyChanged Schnittstelle für ihre Text Eigenschaft implementieren.

Note

WinUI enthält die Microsoft. Ui. Xaml.Data.INotifyPropertyChanged-Schnittstelle. Dies wird nur von C++-Apps verwendet, die keine .NET verwenden.

C#-Apps, die mit .NET erstellt wurden, verwenden stattdessen die Schnittstelle "System.ComponentModel.INotifyPropertyChanged".

Die Implementierung von INotifyPropertyChanged folgt einem festen Muster.

  1. Fügen Sie using Anweisungen für die erforderlichen Namespaces hinzu.

    // ↓ Add this. ↓
    using System.ComponentModel
    using System.Runtime.CompilerServices
    
  2. Implementieren Sie INotifyPropertyChanged. Die Note Klasse implementiert jetzt diese Schnittstelle.

    // ↓ Update this. ↓
    public class Note : INotifyPropertyChanged
    
  3. Erstellen Sie ein Sicherungsfeld (_text) für die Text Eigenschaft.

    // ↓ Delete this. ↓
    // public string Text { get; set; } = string.Empty;
    
    // ↓ Add this. ↓
    private string _text = string.Empty;
    
  4. Ändern Sie die Eigenschaft Text so, dass sie ein Getter-/Setter-Muster mit Benachrichtigung bei Eigenschaftsänderungen verwendet.

    // ↓ Add this. ↓
    public string Text
    {
        get => _text;
        set
        {
            if (_text != value)
            {
                _text = value;
                OnPropertyChanged();
            }
        }
    }
    
  5. Fügen Sie das propertyChanged-Ereignis hinzu, das von der INotifyPropertyChanged Schnittstelle benötigt wird.

    // ↓ Add this. ↓
    public event PropertyChangedEventHandler? PropertyChanged;
    
  6. Fügen Sie die OnPropertyChanged-Methode hinzu. Diese Hilfsmethode löst das PropertyChanged Ereignis mithilfe des CallerMemberName-Attributs für die automatische Erkennung von Eigenschaftennamen aus.

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

Tip

Sie können GitHub Copilot verwenden, um schnell in Ihrer App zu implementierenINotifyPropertyChanged. Diese Codeänderungen wurden mit der Eingabeaufforderung "Implementieren von INotifyPropertyChanged für die Note.Text-Eigenschaft" generiert.

Bindungsmodus

Jetzt benachrichtigt die Text Eigenschaft alle UI-Elemente, die an sie gebunden sind, wenn sich der Wert ändert, sodass die Benutzeroberfläche automatisch aktualisiert werden kann. Damit jedoch die gebundenen UI-Elemente auf die Aktualisierungsbenachrichtigung reagieren können, müssen Sie sicherstellen, dass der richtige BindingMode verwendet wird.

Important

Es ist wichtig, den richtigen BindingMode auszuwählen; andernfalls funktioniert die Datenbindung möglicherweise nicht wie erwartet. (Ein häufiger Fehler bei {x:Bind} besteht darin, dass vergessen wird, die Standardeinstellung BindingMode zu ändern, wenn OneWay oder TwoWay erforderlich ist.)

Name Description
OneTime Aktualisiert die Zieleigenschaft nur, wenn die Bindung erstellt wird. Standard für {x:Bind}.
OneWay Aktualisiert die Zieleigenschaft, wenn die Bindung erstellt wird. Änderungen am Quellobjekt können auch an das Ziel weitergegeben werden.
TwoWay Aktualisiert entweder das Ziel oder das Quellobjekt, wenn sich eine der Änderungen ändert. Wenn die Bindung erstellt wird, wird die Zieleigenschaft aus der Quelle aktualisiert.

Suchen Sie in AllNotesPage.xaml das NoteItemTemplate in Page.Resources. Suchen Sie dann in der Vorlage das TextBlock, das an die Text-Eigenschaft gebunden ist. Aktualisieren Sie die Bindung, um den Bindungsmodus OneWay zu verwenden.

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

Da der Benutzer den Text im TextBlockText nicht aktualisieren kann, ist nur eine OneWay Bindung erforderlich, von der Quelle (Note.Text) bis zum Ziel (TextBlock.Text).

Weitere Informationen finden Sie in den Dokumenten: