기술나눔

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

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