Olayları/mesajları ne zaman kayıt/kayıttan geçirmelisiniz?

Uygulamamdaki olaylara ve mesajlara bakıyorum ama onların yaşam döngüsünden ve onlar için kayıt yaptırmanız gerektiğinden emin değilim.

Kontrol kurucusunda şu anda mesajları (veya olay işleyicileri) almak için kayıt yapıyorum. Kaygılı değilim ama sanırım bir hata

For example in this posting: MVVM Messaging vs RaisePropertyChanged it says to deregister on the Unloaded event.

Hwever uygulamasında Telerik kontrollerini kullanıyorum (diğer kontrollerde de olabilir) ve ana ekranda bir pencere var. Ekranı kapattığımda ve diğer zamanlarda Unloaded ve Loaded olayları pencerenin kendisi kapanmıyor gibi görünse bile tetikler.

Bu yüzden Unloaded 'da kayıt yaptırırsam bir sorun çıkarır. Peki bu noktada ne yapmalıyım?

0

2 cevap

Genel olarak, D. Ancak, Yüklü ve Boşaltılan etkinlik işleyicisinin birden çok kez çağırdığı bazı durumlar var. Kayıttan önce denetlemek için bool değişkeni ekleyerek bu sorunu giderdim.

Örnek kod:

bool _hasRegistered;//default value is false

OnLoaded()
{
    //
    if (!this._hasRegistered)
    {
       //your register code here
        this._hasRegistered = true;
    }
}

OnUnloaded()
{
   //your un-register code here
}
2
katma
İyi bir fikir. Bazen en basit şeyler beni kaçar.
katma yazar Jay, kaynak

Genel olarak konuşursam, artık alakalı olmadıklarını fark ettiğim anda olayları kayıt dışıyorum, bu da değişebilir. Boşaltılan ve hala pencere kalıyorsa, yükün de (sizin de belirttiğiniz gibi) gerçekleştiği anlaşılır. Bu durumda, belki de onları yüke kaydettirin ve boşaltmada onları kaydetmelisiniz. Bu eşleşmeyi garanti etmelidir. Kullanabileceginiz Unload'dan daha iyi bir olay görmüyorum.

2
katma
Etkinliğinizi neyin oluşturduğundan emin değilim, ama eğer bu kontrolden dışarı çıkmışsa, bunu dışarıya kaydedip içeride bir yöntem diyebilirsiniz. Eğer olayın bir parçası ise, o kontrol/sayfada yer alıyorsa, kontrol sırasında tahrip edilmeleri gerektiğinde etraflarında asılı olmamak için herhangi bir problem olmamalıdır (her ne kadar kayıt yaptırdığım bir şeyi kaydetmeyi tercih etsem de). Ancak sonuçta, bu gerçekten sorunuzu cevaplamıyor :(
katma yazar Jay, kaynak
Ne tür bir etkinlik kaydediyorsunuz? Neye bağlı olduğu gibi? Yardım edemiyorum ama eğer pencere/sayfa/kontrolünüzde doğrudan bir şeyle bağlanmışsa, tekrar yüklenirken ateş edemeyeceğini düşünemiyorum. (örneğin bir kontrol)
katma yazar Jay, kaynak
Daha önce söylediğimi geri aldım. Olayı XMPP sunucusundan almak için yayınlayan şey, pencereniz/denetiminiz tamamen kapatıldığında bu olay işleyicileri, bu nesne kapsam dışına çıkana ve çöp toplanıncaya kadar kalmaya devam ederse. Mevcut açık pencerelerin bir listesini tutuyor musunuz? Eğer öyleyse, sanırım, olayların kaydını ve kayıtlarını, pencereleri kendilerinin takip etmesini sağlayan yöntemlere taşımak zorunda kalacaksınız.
katma yazar Jay, kaynak
Bunu öngördüğüm problem, olayın kayıt altına alındığı ikinci bölümde, birisinin kaldırılıp gözden kaçırılabileceğidir.
katma yazar Firedragon, kaynak
Bir XMPP sunucusundan gönderilen bir mesaj olurdu, bu yüzden ne yazık ki tekrar yüklenirken ateş edebilir
katma yazar Firedragon, kaynak