Mengirim Pesan Umum

public class Foo<T> where T: Entity
{}

public class Foo1
: Foo<Telephone>
{
}

public class Foo2
: Foo<Home>
{   
}

Bagaimana cara mengirim Foo1 ke Foo2? Saya menyadari bahwa pesan tersebut diketik, dan karenanya pesan dengan jenis yang sama diterima - tetapi saya perlu mengirim pesan antar kelas turunan...

Sebuah contoh akan sangat dihargai.


person codeputer    schedule 26.05.2011    source sumber


Jawaban (2)


pesan di mvvmlight secara teori seharusnya dibakar dan dilupakan...pengirim tidak peduli siapa yang menerima pesan dan penerima tidak peduli siapa yang mengirim pesan, asalkan jenis pesannya tepat untuk didengarkan. Saya telah menemukan melalui banyak percobaan dan kesalahan bahwa jauh lebih mudah untuk membuat pesan Anda sendiri daripada menggunakan default yang disediakan oleh mvvm-light, itu adalah titik awal yang baik, tetapi kadang-kadang Anda hanya menemukan diri Anda melompati rintangan..

public class ExceptionMessage : GalaSoft.MvvmLight.Messaging.GenericMessage<System.Exception>
    {
        public ExceptionMessage(System.Exception content) : base(content) { }
        public ExceptionMessage(object sender, System.Exception content) : base(sender, content) { }
        public ExceptionMessage(object sender, object target, System.Exception content) : base(sender, target, content) { }
    }

Kode penerima:

Messenger.Default.Register<Core.Messaging.ExceptionMessage>(this, ex => ShowExceptionMessage(ex));

Kode Pengirim:

public void LogException(Exception content)
        {
            _messenger.Send<Core.Messaging.ExceptionMessage>(new ExceptionMessage(content));
            //GetBw().RunWorkerAsync(content);
            WriteToDatabaseLog(content);
        }

dan ya ini mematahkan saran dalam kalimat pertama saya, tetapi secara teori saya dapat memiliki beberapa vm atau tampilan mendengarkan pesan pengecualian.

Mungkin contoh lain untuk membantu Anda... saya benci semua hal foo...itu selalu membingungkan saya...

Ini ada di modul inti saya:

public class SaveNotification<T> : GalaSoft.MvvmLight.Messaging.NotificationMessage<T> where T : GalaSoft.MvvmLight.ViewModelBase
    {
        public SaveNotification(T content, string notification) : base(content, notification) { }
        public SaveNotification(object sender, T content, string notification) : base(sender, content, notification) { }
        public SaveNotification(object sender, object target, T content, string notification) : base(sender, target, content, notification) { }
    }

inilah cara saya menggunakannya di vm saya:

public void OnSubmitChanges(SubmitOperation so)
        {
            if (so.HasError)
            {
                Infrastructure.GetService<IExceptionLoggingInterface>().LogException(this, so.Error);
            }
            else
            {
                //Save Responses
                _messenger.Send<Messages.NavigationRequest<SubClasses.URI.PageURI>>(GetNavRequest_HOME());
                ClearQuestionaire(true);
                _messenger.Send<WavelengthIS.Core.Messaging.SaveNotification<QuestionairreViewModel>>(GetSuccessfulSaveNotification());

            }

            Wait.End();
        }

        private WavelengthIS.Core.Messaging.SaveNotification<QuestionairreViewModel> GetSuccessfulSaveNotification()
        {
            return new WavelengthIS.Core.Messaging.SaveNotification<QuestionairreViewModel>(this, "Save Successfull");
        }
person ecathell    schedule 27.05.2011
comment

Apakah Anda melewatkan tugas EventHandler di suatu tempat? Saya tidak melihatnya di sini.

Saya yakin Anda melewatkan beberapa kode desainer yang terlihat seperti berikut:

this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged);

Ini adalah masalah dengan penggunaan kode yang dibuat secara otomatis dari GUI drag and drop. Ketika rusak, orang tidak tahu bagaimana cara memperbaikinya.

Coba hapus BackgroundWorker dan mulai lagi dari awal.

- person codeputer; 27.05.2011

Alternatifnya adalah membuat kelas Anda sendiri yang berisi payload yang ingin Anda kirimkan (Foo1 atau cukup object). Kemudian di Foo2, daftar untuk menerima pesan jenis kelas yang baru saja Anda buat.

Tautan ini menjelaskan caranya dengan contoh yang sangat mudah dipahami.

Sup Toolkit Ringan MVVM Untuk Kacang 3 - Jesse Liberty

person Vincenzo Piscitelli    schedule 27.05.2011