ObservableRecipient

Jenisnya ObservableRecipient adalah kelas dasar untuk objek yang dapat diamati yang juga bertindak sebagai penerima pesan. Kelas ini adalah ekstensi yang juga menyediakan dukungan bawaan ObservableObject untuk menggunakan jenis .IMessenger

API Platform:ObservableRecipient, ObservableObject, IMessenger, WeakReferenceMessenger, IRecipient<TMessage>, PropertyChangedMessage<T>

Cara kerjanya

ObservableRecipient Jenis ini dimaksudkan untuk digunakan sebagai basis untuk viewmodel yang juga menggunakan IMessenger fitur, karena menyediakan dukungan bawaan untuk itu. Secara khusus:

  • Ini memiliki konstruktor tanpa parameter dan konstruktor yang mengambil IMessenger instans, untuk digunakan dengan injeksi dependensi. Ini juga mengekspos Messenger properti yang dapat digunakan untuk mengirim dan menerima pesan di viewmodel. Jika konstruktor tanpa parameter digunakan, WeakReferenceMessenger.Default instans akan ditetapkan ke Messenger properti .
  • Ini mengekspos IsActive properti untuk mengaktifkan/menonaktifkan viewmodel. Dalam konteks ini, untuk "mengaktifkan" berarti bahwa viewmodel tertentu ditandai sebagai sedang digunakan, misalnya. ini akan mulai mendengarkan pesan terdaftar, melakukan operasi penyiapan lainnya, dll. Ada dua metode terkait, OnActivated dan OnDeactivated, yang dipanggil ketika properti berubah nilai. Secara default, OnDeactivated secara otomatis membatalkan pendaftaran instans saat ini dari semua pesan terdaftar. Untuk hasil terbaik dan untuk menghindari kebocoran memori, disarankan untuk digunakan OnActivated untuk mendaftar ke pesan, dan digunakan OnDeactivated untuk melakukan operasi pembersihan. Pola ini memungkinkan viewmodel diaktifkan/dinonaktifkan beberapa kali, sekaligus aman untuk dikumpulkan tanpa risiko kebocoran memori setiap kali dinonaktifkan. Secara default, OnActivated akan secara otomatis mendaftarkan semua penangan pesan yang ditentukan melalui IRecipient<TMessage> antarmuka.
  • Ini mengekspos Broadcast<T>(T, T, string) metode yang mengirim pesan melalui instans PropertyChangedMessage<T> yang IMessenger tersedia dari Messenger properti. Ini dapat digunakan untuk dengan mudah menyiarkan perubahan dalam properti viewmodel tanpa harus mengambil Messenger instans secara manual untuk digunakan. Metode ini digunakan oleh kelebihan beban berbagai SetProperty metode, yang memiliki properti tambahan bool broadcast untuk menunjukkan apakah akan mengirim pesan atau tidak.

Berikut adalah contoh viewmodel yang menerima LoggedInUserRequestMessage pesan saat aktif:

public class MyViewModel : ObservableRecipient, IRecipient<LoggedInUserRequestMessage>
{
    public void Receive(LoggedInUserRequestMessage message)
    {
        // Handle the message here
    }
}

Dalam contoh di atas, OnActivated secara otomatis mendaftarkan instans sebagai penerima pesan LoggedInUserRequestMessage , menggunakan metode tersebut sebagai tindakan yang akan dipanggil. IRecipient<TMessage> Menggunakan antarmuka tidak wajib, dan pendaftaran juga dapat dilakukan secara manual (bahkan hanya menggunakan ekspresi lambda sebaris):

public class MyViewModel : ObservableRecipient
{
    protected override void OnActivated()
    {
        // Using a method group...
        Messenger.Register<MyViewModel, LoggedInUserRequestMessage>(this, (r, m) => r.Receive(m));

        // ...or a lambda expression
        Messenger.Register<MyViewModel, LoggedInUserRequestMessage>(this, (r, m) =>
        {
            // Handle the message here
        });
    }

    private void Receive(LoggedInUserRequestMessage message)
    {
        // Handle the message here
    }
}

Contoh