문제

WPF 응용 프로그램을 작업하고 있으며 Model-View-ViewModel 패턴을 사용하고 있습니다.

응용 프로그램은 현재 두 개의 모듈로 구성됩니다.

  • 트리를 찾아 내고 노드를 선택하려면 왼쪽 패널
  • 선택한 트리 노드의 내용을 표시하는 메인 패널.

이 두 모듈을 분리하고 싶지만 왼쪽 패널에서 노드를 선택하면 기본 패널이 구독 할 수있는 이벤트를 발사해야합니다. 왼쪽과 메인 패널을 결합하고 싶지 않으므로 ViewModel 클래스의 인스턴스를 공유하고 싶지 않습니다.

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

프리즘에서는 느슨하게 결합 된 이벤트 인프라를 사용하여 이것을 해결할 것입니다. 그것은 당신이 어떤 계층의 모든 클래스에서 이벤트를 발사하고, 어떤 클래스의 모든 이벤트를들을 수 있습니다. 기본적으로 이벤트의 게시자와 가입자는 분리됩니다.

나는 명령을 사용하여 내보기와 내 뷰 모델 사이의 느슨한 커플 링을 달성하지만 적절한 크로스 뷰 커뮤니케이션을 수행하는 방법을 잘 모르겠습니다.

모든 팁이나 제안은 대단히 감사합니다.

나는 구체적으로 찾고있다 진짜 .NET 2.0/3.0 (LINQ 재료 없음)에 대한 Light Geight Pub/Sub Event 모델 또는 두 모듈을 결합하지 않고 Cross View (모듈) 통신을 구현하는 다른 것.

업데이트: 나는 글렌이 제안한 것과 비슷한 방식으로 이것을 해결하게되었습니다. 나는 별도의 이벤트 서비스 (명령 프록시라고 부릅니다)를 가지고 있으며 서비스 로케이터의 생성자를 통해 모든 뷰 모델을 전달합니다 (현재 IOC 컨퍼런스 대신 서비스 로케이터를 사용하고 있음). CommandProxy는 Prism (Composite WPF Guidance)에서 DelegateCommand의 확장 인 MultidelegateCommants 세트를 노출시킵니다. 기본적으로 시각적 트리에서 분리 된 명령을 허용하고 여러 구독자를 지원합니다.

도움이 되었습니까?

해결책

IOC 컨테이너가 있습니까? 간단한 접근 방식 중 하나는 이벤트를 발사하는 사용자 정의 서비스를 만드는 것입니다. 이벤트 애그리 게이터는 일반적이지만 원하는 작업을 수행하는 특정 서비스를 만들 수 있습니다.

예를 들어, 선택 선택한 메소드가있는 eventingservice를 만듭니다. 이 방법은 서비스를 시작하는 노드 선택 이벤트를 시작합니다. 그런 다음 서비스는 IOC 컨테이너에 등록되어 게시자와 가입자가이를 얻을 수 있습니다. 이런 식으로 MainPanel이 구독해야한다고 말하면 MainPanelViewModel이 생성자의 EventingServiec에 주입됩니다. 그런 다음 구독합니다. WPF를 사용하는 경우 또 다른 접근 방식은 Composite App Library 코드에서 CompositeCommand를 끌어 내고 이벤트 서비스가 CompositeCommand를 노출시키는 것입니다. 그런 다음 각 가입자 (보기 모델)는 서비스에 명령을 등록합니다. OnNodeelected가 호출되면 CompositeCommand의 집행이 호출되어 모든 이해 당사자에게 알립니다.

Composite App Guidance를 위해 문서 에서이 서비스를 위해 자신의 서비스를 사용하는 것에 대해 이야기합니다. (http://msdn.microsoft.com/en-us/library/cc707836.aspx). Francis Cheung도 이것에 대한 게시물을 가지고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top