技術共有

wpf の異なる DataContext 間の通信

2024-07-12

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

WPFでは、DataContext通常、UI 要素 (コントロールなど) とそのバックエンド ロジック (ViewModel など) の間のデータ バインディングを確立するために使用されます。別のものを使用する必要がある場合DataContext異なる ViewModel 間で通信する場合、これは通常、異なる ViewModel またはデータ レイヤー間で情報を渡す必要があることを意味します。

WPF 自体はクロス機能を直接提供しません。DataContext通信メカニズムですが、次の方法で実現できます。

1. メッセージ受け渡しメカニズム (EventAggregator など)

Prism ライブラリなどのメッセージ受け渡しメカニズムを使用するEventAggregatorまたは .NET に付属のものEventAggregator実装などMicrosoft.Extensions.Hosting.Internal.IHostedServiceカスタム イベント (後者は主にサービス間の通信に使用されますが) とは異なり、イベントとメッセージは異なるコンポーネントまたは ViewModel 間で受け渡すことができます。これにより、ある ViewModel でイベントを発行し、それに応答して別の ViewModel でイベントをサブスクライブすることができます。

2. シェアードサービス(サービス)

を含む共有サービス クラスを作成します。DataContext共有データまたはロジック。その後、このサービスを必要とする ViewModel にこのサービスを挿入できます。このようにして、異なる ViewModel は共有サービスを通じて間接的に通信できます。

3. 依存性の注入

依存関係注入フレームワーク (.NET Core の組み込み DI コンテナー、Autofac、Ninject など) を使用して、ViewModel やその他のクラスのライフ サイクルと依存関係を管理します。これにより、アプリケーションをより柔軟に構築および構成できるようになり、異なる ViewModel 間で依存関係を共有できるようになります。

4. 親または共有 ViewModel

2 つの ViewModel の間に親子関係がある場合、または上位レベルの ViewModel を共有している場合は、親または共有 ViewModel を介してデータまたはコマンドを渡すことができます。これには通常、親 ViewModel でイベントまたはコマンドを定義し、子 ViewModel でそれらのイベントまたはコマンドをトリガーすることが含まれます。

5. 添付プロパティ

場合によっては、添付プロパティを使用して UI 要素間で情報を渡すことができますが、これは通常、ViewModel 間の通信ではなく、UI 要素間の直接通信に使用されます。ただし、プロパティをアタッチすることによって、たとえば ViewModel でコマンドをトリガーすることによって、ViewModel 間の通信に間接的に影響を与えることができます。

例: EventAggregator の使用

以下はPrismを使用した例ですEventAggregator異なる ViewModel 間の通信の簡単な例:

  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. });