2008-10-22 6 views
3

WPF 애플리케이션에서 작업 중이며 Model-View-ViewModel 패턴을 사용하고 있습니다.프리즘을 사용하지 않고 WPF에서 느슨하게 결합 된 이벤트

  • 왼쪽 패널은 트리를 탐색하고 선택한 트리 노드의 내용을 표시하는 노드
  • 주 패널을 선택합니다 :

    응용 프로그램은 순간에 두 가지 모듈로 구성되어 있습니다.

왼쪽 패널에서 노드를 선택할 때 주 패널을 구독 할 수있는 이벤트를 실행해야합니다. 왼쪽 패널과 주 패널을 결합하지 않으므로 ViewModel 클래스의 인스턴스를 공유하고 싶지 않습니다.

필자는 Prism (WPF Composite Application Guidance)을 사용하는 것이 가장 좋지만 현재 기존 응용 프로그램을 확장하고 있으며 더 많은 종속성을 도입 할 수는 없습니다. 이 프로젝트는 또한 .NET 3.0 (3.5 아님)에 있으므로 .NET 3.5로 작성된대로 Prism을 .NET 3.0으로 다시 변환해야합니다.

프리즘에서 나는 느슨하게 결합 된 이벤트 인프라를 사용하여이 문제를 해결할 것입니다. 모든 레이어의 모든 클래스에서 이벤트를 시작하고 모든 레이어의 모든 클래스에서 이벤트를 수신 할 수 있습니다. 기본적으로 이벤트의 게시자와 구독자는 분리됩니다.

명령을 사용하여 내 View와 내 ViewModel간에 느슨한 결합을 이루지 만 적절한 뷰 간 통신을 수행하는 방법을 모르겠습니다.

모든 요령이나 제안 사항을 매우 높이 평가합니다.

내가 특별히 .NET 2.0/3.0 (NO LINQ 물건)에 대한 정말 가벼운 무게 술집/서브 이벤트 모델을 찾고, 또는 다른 어떤 것은 두 가지를 결합하지 않고 통신을 교차보기 (모듈)을 구현하는 모듈.

업데이트 : 글렌이 제안한 것과 비슷한 방식으로이를 해결했습니다. 나는 별도의 EventService (CommandProxy라고 부름)를 가지고 있으며, 서비스 로케이터 (IoC 컨테이너 대신 Service Locator를 사용하고있는 순간)의 생성자를 통해 모든 ViewModel에 전달한다. CommandProxy는 Prism (Composite WPF Guidance)에서 DelegateCommand의 확장 인 MultiDelegateCommants를 노출합니다. 기본적으로 Visual Tree와의 연결을 끊고 여러 구독자를 지원하는 명령을 허용합니다.

답변

7

IoC 컨테이너가 있습니까? 한 가지 간단한 방법은 이벤트를 발생시키는 사용자 지정 서비스를 만드는 것입니다. Event Aggregator는 일반적이지만 원하는 것을 수행하는 특정 서비스를 만들 수 있습니다.

예를 들어 OnNodeSelected 메서드가있는 EventingService를 만듭니다. 이 메소드는 서비스를 중단시키는 NodeSelected 이벤트를 발생시킵니다. 그러면 서비스가 IoC 컨테이너에 등록되어 게시자와 가입자가 액세스 할 수있게됩니다. MainPanel을 구독해야하는 경우 MainPanelViewModel에 생성자의 EventingServiec이 삽입됩니다. 그런 다음 가입 할 것입니다. WPF를 사용하는 경우 다른 방법은 Composite App Library 코드에서 CompositeCommand를 가져 와서 Eventing 서비스가 CompositeCommand를 노출하게하는 것입니다. 그런 다음 각 가입자 (모델보기)는 해당 명령을 서비스에 등록합니다. OnNodeSelected가 호출되면 CompositeCommand의 execute가 호출되어 모든 관련 당사자에게 알립니다.

커뮤니케이션 주제의 느슨하게 결합 된 이벤트에 대한 섹션의 www.microsoft.com/compositewpf에있는 복합 애플리케이션 지침의 문서에서 자신의 서비스를 사용하는 방법에 대해 이야기합니다. (http://msdn.microsoft.com/en-us/library/cc707836.aspx). 프란시스 청 (Francis Cheung)도 이에 대한 글을 올렸습니다.

관련 문제