Berbagi teknologi

Komunikasi antara DataContexts yang berbeda di wpf

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Di WPF,DataContext Biasanya digunakan untuk membuat pengikatan data antara elemen UI (seperti kontrol) dan logika backendnya (seperti ViewModels).Ketika Anda perlu menggunakan yang berbedaDataContextSaat berkomunikasi antara ViewModel yang berbeda, ini biasanya berarti Anda perlu meneruskan informasi antara ViewModel atau lapisan data yang berbeda.

WPF sendiri tidak secara langsung menyediakan lintas-DataContextMekanisme komunikasi, tetapi Anda dapat mencapainya dengan cara berikut:

1. Mekanisme penyampaian pesan (seperti EventAggregator)

Gunakan mekanisme penyampaian pesan seperti di perpustakaan PrismEventAggregatorAtau yang dilengkapi dengan .NETEventAggregatorImplementasi, sepertiMicrosoft.Extensions.Hosting.Internal.IHostedService Tidak seperti peristiwa khusus (meskipun peristiwa khusus ini terutama digunakan untuk komunikasi antar layanan), peristiwa dan pesan dapat diteruskan antar komponen atau ViewModel yang berbeda. Hal ini memungkinkan Anda memublikasikan peristiwa di satu ViewModel dan berlangganan peristiwa di ViewModel lain sebagai respons terhadap peristiwa tersebut.

2. Layanan bersama (Layanan)

Buat kelas layanan bersama yang berisiDataContext Data atau logika bersama. Anda kemudian dapat memasukkan layanan ini ke dalam ViewModel yang membutuhkannya. Dengan cara ini, ViewModel yang berbeda dapat berkomunikasi secara tidak langsung melalui layanan bersama.

3. Injeksi Ketergantungan

Gunakan kerangka kerja injeksi ketergantungan (seperti wadah DI bawaan .NET Core, Autofac, Ninject, dll.) untuk mengelola siklus hidup dan ketergantungan ViewModel Anda dan kelas lainnya. Hal ini membantu Anda membangun dan mengonfigurasi aplikasi dengan lebih fleksibel dan memungkinkan Anda berbagi dependensi antar ViewModel yang berbeda.

4. ViewModel induk atau bersama

Jika ada hubungan induk-anak antara dua ViewModel atau keduanya berbagi ViewModel tingkat yang lebih tinggi, Anda dapat meneruskan data atau perintah melalui ViewModel induk atau bersama. Hal ini biasanya melibatkan pendefinisian peristiwa atau perintah di ViewModel induk dan memicu peristiwa atau perintah tersebut di ViewModel anak.

5. Properti Terlampir

Dalam beberapa kasus, Anda dapat menggunakan properti terlampir untuk meneruskan informasi antar elemen UI, namun properti ini umumnya digunakan untuk komunikasi langsung antar elemen UI, bukan komunikasi antar ViewModel. Namun, Anda dapat secara tidak langsung memengaruhi komunikasi antar ViewModel dengan melampirkan properti, misalnya dengan memicu perintah di ViewModel.

Contoh: Menggunakan EventAggregator

Berikut ini adalah contoh penggunaan PrismEventAggregatorContoh sederhana komunikasi antara ViewModels yang berbeda:

  1. // 定义事件
  2. public class MyEvent : PubSubEvent<string>
  3. {
  4. }
  5. // 发布事件
  6. eventAggregator.GetEvent<MyEvent>().Publish("Hello, World!");
  7. // 订阅事件
  8. eventAggregator.GetEvent<MyEvent>().Subscribe(message =>
  9. {
  10. // 处理消息
  11. Console.WriteLine(message);
  12. });