Gezinti önbelleği ve değişiklik bildirimi

İlk adım, yapmanız gereken değişiklikler için temel kurulumu yapmaktır:

  • gezinti önbelleğini etkinleştirin.
  • özelliği için Note.Text özellik değişikliği bildirimleri uygulayın.

Bu işlem tamamlandıysa, uygulamanın diğer bölümlerini bu değişikliklerle çalışacak şekilde uyarlayacaksınız.

Tavsiye

Bu öğreticinin tamamlanmış kodunu WinUI Notları bölüm 2'deki GitHub deposundan indirebilir veya görüntüleyebilirsiniz. Projenin başlangıç ve bitiş noktaları arasındaki farkları görmek için şu işlemeye bakın: 2. bölüm güncelleştirmeleri.

NavigationCacheMode'yi etkinleştirme

Varsayılan olarak, her gezinti gerçekleştiğinde varsayılan değerleriyle yeni bir Sayfa örneği oluşturulur. WinUI Notları uygulamasında, tüm notesModel örneklerinin depolandığı Note de burada oluşturulur.

içinde AllNotesPage.xamlNavigationCacheMode öğesini Etkin (NavigationCacheMode="Enabled" olarak ayarlayın. NavigationCacheMode Etkinleştirildiğinde, aynı sayfa örneği çevresinde tutulur, bu nedenle her gezintide yeni Page bir örnek oluşturulmaz ve notesModel yeniden oluşturulmaz.

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

Uygulamayı şimdi çalıştırdığınızda bu değişikliğin bazı yan etkilerini göreceksiniz.

  1. Var olan bir notu düzenlediğinizde, geri döndüğünüzde değişiklikleriniz tüm notlar sayfasına yansıtılamaz.
  2. Yeni bir not oluşturup kaydettiğinizde, geri döndüğünüzde notlar listesinde görünmez.
  3. Var olan bir notu sildiğinizde, geri döndüğünüzde tüm notlar listesinden kaldırılmaz.

Bu sorunları bir sonraki adımda çözeceksiniz.

Belgelerde daha fazla bilgi edinin:

INotifyPropertyChanged uygulayın

Var olan bir notu düzenleyip kaydettiğinizde, yaptığınız değişiklik dosya sistemine kaydedilir, ancak değişiklik tüm notlar listesine yayılmaz. Bunun nedeni, Note sınıfının, TextBox öğesini Note metnine bağlayan veri bağlamasına bir güncelleme olduğunu bildirmemesidir. Bu bildirimin gerçekleşmesi için, Note sınıfının INotifyPropertyChanged özelliği için Text arabirimini uygulaması gerekir.

Note

WinUI, Microsoft.UI.Xaml.Data.INotifyPropertyChanged arabirimini içerir. Bu yalnızca .NET kullanmayan C++ uygulamaları tarafından kullanılır.

.NET ile oluşturulan C# uygulamaları bunun yerine System.ComponentModel.INotifyPropertyChanged arabirimini kullanır.

INotifyPropertyChanged’nin uygulanması belirli bir kalıbı takip eder.

  1. Gerekli ad alanları için using deyimlerini ekleyin.

    // ↓ Add this. ↓
    using System.ComponentModel
    using System.Runtime.CompilerServices
    
  2. uygulayın INotifyPropertyChanged. sınıfı Note şimdi bu arabirimi uygular.

    // ↓ Update this. ↓
    public class Note : INotifyPropertyChanged
    
  3. _text özelliği için bir yedek alan (Text) oluşturun.

    // ↓ Delete this. ↓
    // public string Text { get; set; } = string.Empty;
    
    // ↓ Add this. ↓
    private string _text = string.Empty;
    
  4. Text özelliğini, özellik değiştirme bildirimine sahip bir getter/setter düzeni kullanacak şekilde değiştirin.

    // ↓ Add this. ↓
    public string Text
    {
        get => _text;
        set
        {
            if (_text != value)
            {
                _text = value;
                OnPropertyChanged();
            }
        }
    }
    
  5. arabiriminin gerektirdiği INotifyPropertyChanged olayını ekleyin.

    // ↓ Add this. ↓
    public event PropertyChangedEventHandler? PropertyChanged;
    
  6. OnPropertyChanged yöntemini ekleyin. Bu yardımcı yöntem, özellik adını otomatik olarak algılamak için PropertyChanged özniteliğini kullanarak olayını tetikler.

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

Tavsiye

GitHub Copilot kullanarak uygulamanıza hızla uygulayabilirsiniz.INotifyPropertyChanged Bu kod değişiklikleri şu istemle oluşturuldu: "Note.Text özelliği için INotifyPropertyChanged Uygulayın".

Bağlama modu

Artık özelliği, değeri her değiştiğinde Text ona bağlı tüm kullanıcı arabirimi öğelerini bilgilendirir, böylece kullanıcı arabiriminiz otomatik olarak güncelleştirilebilir. Ancak, bağlı kullanıcı arabirimi öğelerinin güncelleştirme bildirimine tepki verebilmesi için doğru BindingMode'un kullanıldığından emin olmanız gerekir.

Important

Doğru BindingMode'u seçmek önemlidir; aksi takdirde, veri bağlamanız beklendiği gibi çalışmayabilir. (sık karşılaşılan bir hata, {x:Bind} gerektiğinde veya BindingMode gerektiğinde varsayılan OneWay değiştirmeyi unutmaktır.TwoWay)

Name Description
OneTime Hedef özelliği yalnızca bağlama oluşturulduğunda güncelleştirir. için {x:Bind}varsayılan değeridir.
OneWay Bağlama oluşturulduğunda hedef özelliğini güncelleştirir. Kaynak nesnedeki değişiklikler hedefe de yayılabilir.
TwoWay Her biri değiştiğinde hedefi veya kaynak nesneyi güncelleştirir. Bağlama oluşturulduğunda hedef özellik kaynaktan güncelleştirilir.

AllNotesPage.xaml içinde, NoteItemTemplate içindeki Page.Resources öğesini bulun. Ardından, şablonda TextBlock özelliğine bağlı olan Text öğesini bulun. Bağlamayı, OneWay bağlama modunu kullanacak şekilde güncelleştirin.

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

Kullanıcı TextBlock içindeki metni güncelleyemediğinden, kaynaktan (OneWay) hedefe (Note.Text) yalnızca bir TextBlock.Text bağlaması yeterlidir.

Belgelerde daha fazla bilgi edinin: