2017-04-23 9 views
0

메시지가 뷰의 생성자에 등록 될 때 여러 번 등록되기 때문에 메시지가 여러 번 발생하는 문제가 발생했습니다. S.O.의 대다수 게시물, 웹 사이트, 블로그는 다음과 같은 예를 보여MvvmLight Messaging - 메시지를 등록하고 등록을 취소하는 적절한 방법은 무엇입니까?

public ConstructorOfView() { 
    DataContext = viewModelObject; 
    Messenger.Default.Register<SomeClass>(recipient, token, method); 
} 

public someUnloadOrNavigateFromMethod() { 
    Messenger.Default.Unregister<SomeClass>(parameters and more); 
} 

등록 취소 나에게 아무런 영향이없는 것으로 보인다. 일부 예제에서는 ViewModel 내부에 메시지를 등록한다고합니다. 이것은 두 가지 이유로 나에게 이해가되지 않습니다. 1) 페이지의 DataContext를 ViewModel로 설정하면 ViewModel 생성자가 뷰 생성자와 마찬가지로 다시 두 번 호출됩니다. 2) ViewModel 안에 메시지를 등록하는 경우 뷰를 public static으로 만드는 것 이외에 메서드를 시작하는 방법을 정확히 알려줌으로써 메시지 대화 상자를 보여줍니다. viewmodel 내부의 대화 상자와 같은 UI 관련 요소를 호출하는 세 번째 옵션은 MvvM의 개념을 위반하는 것 같습니다.

메시지를 등록하고 등록을 취소하는 적절한 방법은 무엇입니까?

일부 게시물은 viewmodel Cleanup()을 호출하는 것이 좋지만 어떻게 든 viewmodel에 메시지를 등록해야하지만 메시지 수신자를 viewmodel로 설정하면 어떻게 뷰 모델 뷰에서 비 public-static 메소드를 호출하여 UI를 변경/표시 하시겠습니까?

답변

0

저는 일반적으로 내보기 모델이 IOC 컨테이너에 등록되어있는 패턴을 사용하고 (MVVMLight 시작 응용 프로그램의 VireModelLocator 클래스를 살펴 봅니다) ViewModel 생성자에 메시지를 등록합니다.

그런 식으로 ViewModel 생성이 IOC에 의해 처리되기 때문에 관련 뷰의 여러 생성에 문제가 없으며 메시지 등록은 한 번만 발생합니다.

메시지 등록 및 등록 취소 기능을 사용하면 메시지를 보내는 버그를 쉽게 찾을 수 없지만 어떤 이유로 든 등록 된 제트기 핸들러가 없다는 점도 기억하십시오.

뷰/뷰 모델 상호 작용의 99 %가 바인딩을 수행해야한다고 덧붙입니다.

프로그래밍 패턴을 식별하고 이해하기 위해 MvvmLight에서 제공하는 WPF 응용 프로그램 템플릿을 검토하는 것이 좋습니다.

+0

답장을 보내 주셔서 감사합니다. 내가 혼란스러워하는 한 가지. viewmodel에 메시지를 등록하는 경우 대화 상자를보기와 뷰에서 처리해야 할 때 대화 상자와 같은 UI를 어떻게 변경하거나 표시합니까? 그것이 뷰 모델 내에 메시지를 등록하는 것에 대해 나에게 이해가되지 않는 것입니다. – ShrimpCrackers

+0

나는 당신의 의심을 이해하고, 어떻게 든 그것에 동의한다. 사실 thre은 코드를 작성하는 플랫폼을 기반으로하는 많은 솔루션입니다. Windows 용 wpf 응용 프로그램을 작성한다고 가정하면 첫 번째 문제는 mvvm 극단 주의자가 아니며 메시지 처리기에서 MessageBox.Show를 직접 호출하는 것입니다. 때로는이를 수행하고 MVVM 원칙을 위반하지만 수백 줄의 코드를 저장할 수 있습니다. 두 번째 : 사용자에게 메시지를 표시하고 메시지를 표시하기 위해 일부 UI 컨트롤에 바인딩을 사용하는 방법에 대해 다시 생각해보십시오. 셋째 : 대화 상자 대신 새로운 팝업보기를 보여줍니다. –