2010-06-22 2 views
1

로케이터 패턴과 MVVM-Light 라이브러리를 사용하도록 변환하려는 기존 Silverlight 4 응용 프로그램이 있습니다.MVVM-Light Locator 패턴 및 재사용 가능한 UserControl

MvvmLocator 클래스는 각 뷰 모델에 대한 참조를 유지하며 각보기의 DataContext를 로케이터의 적절한 ViewModel에 바인딩 할 수 있습니다.

내 응용 프로그램은 탐색 프레임을 사용하므로 응용 프로그램의 각 페이지는 Content 프레임에로드되는 UserControl입니다.

각 페이지 뷰를 로케이터의 적절한 ViewModel에 바인딩하는 것이 얼마나 쉬운 지 알 수 있지만 내 문제는 여러 컨텍스트에서 재사용되는 자체 뷰 모델이있는 다른 UserControls가 있다는 것입니다. 컨트롤의 각 인스턴스가 동일한 궁극적 인 뷰 모델 인스턴스에 바인딩되면 문제가 발생합니다.

예를 들어 2 개의 사용자 컨트롤로 구성된 검색 페이지가 있습니다. 첫 번째는 몇 가지 상호 종속적 인 콤보 상자와 검색 버튼을 포함하는 검색 매개 변수 컨트롤입니다. 두 번째는 결과 그리드 자체입니다. 이 두 컨트롤을 포함하는 페이지의 뷰 모델은 두 컨트롤 사이의 통신을 처리합니다. 문제는이 검색 컨트롤이 다른 페이지에서도 사용되며 동일한보기 모델 인스턴스를 모두 사용하면 모든 종류의 골칫거리가 발생한다는 것입니다. 따라서 정상적인 "DataContext = {바인딩 ProductSearch, 소스 = {StaticResource Locator}}"는 궁금한 것 같습니다 ...

다른 사람이이 문제를 해결하거나 해결 방법을 알고 있습니까? 컨트롤을 사용하는 각 페이지에 대한 뷰 모델의 새 인스턴스를 만들 수있는 로케이터를 수정할 수 있습니다. 그렇지 않으면 모든 페이지 전환시 강제로 정리를 수행 할 수 있지만 페이지간에 상태를 저장할 수는 없습니다.

전 Silverlight 및 MVVM 세계에 새로운 것이므로 어쩌면이 모든 것이 어떻게 구성되어야하는지 또는 구석에 그림을 그려야할지 모르는 경우가 있습니다. 나는 잘 모르겠다. 나는 어떤 제안이라도 확실히 환영 할 것이다.

답변

2

중요한 문제는 사용자가 탐색 할 때 Silverlight 탐색 프레임 워크가 항상보기의 새 인스턴스를 만드는 사실입니다. INavigationContentLoader를 사용하고 재사용 할 뷰의 인스턴스를 저장하여이 동작을 무시할 수 있습니다.

INavigationContentLoader를 사용하는 몇 가지 예는 David Poll의 Opening up Silverlight 4 Navigation: Introduction to INavigationContentLoader 또는 Mike Taultry의 Silverlight 4 Rough Notes: Taking Control of Navigation 블로그 게시물입니다. 이러한 게시물은 자신 만의 콘텐츠 로더를 만드는 방법을 보여줍니다. 기존보기를 다시로드하는 데 사용하면됩니다.

+0

인터페이스가 존재한다는 것을 전혀 모릅니다. 감사! 그것은 여러 가지면에서 도움이됩니다. 그러나, 나는 여전히 재사용 가능한 UserControl의 DataContext를 바인딩하는 방법에 대한 질문을 가지고있다. 내가 생각한 것은 최상위 페이지에 대한 뷰 모델의 구성원으로 필요한 뷰 모델의 인스턴스를 만든 다음 페이지에서 참조 할 때 UserControls에 바인딩한다는 것입니다. 적어도 생성자에서 자식 뷰 모델 인스턴스를 매개 변수로 요구하는 페이지 뷰 모델에 대해서는이 작업을 수행 할 수 있습니다. 말이 돼? – user373708

+0

나는 당신이 자식 UserControl 뷰가 매회 다시 만들어지면 괜찮은 해결책이라고 생각한다. 대신보기에 대한 참조를 작성하면 ViewModel을 다시 사용하는 것에 대해 걱정할 필요가 없습니다. 또한 특정 ViewModel을 요청할 때마다 새 인스턴스를 반환하도록 ViewModelLocator를 수정하여 뷰가 실수로 ViewModel을 다시 사용하지 않도록 할 수 있습니다. –

+0

뷰에 대한 참조를 만드는 것에 대한 요지를 잘 모르겠습니다. 예를 들어, 다음 생성자가있는 뷰 모델이 있다고 가정 해 봅시다. SearchPageVM (SearchControlVM svm, ResultsControlVM rvm). 로케이터가이 인스턴스를 구성하면,이 인스턴스를 DataContext로 가져올 수있는 방식으로 컨트롤을 바인딩해야합니다.반면, UserControls VM 인스턴스를 만들면 모든 생성자를 변경하고 하위 뷰 VM을 다른 위치로 초기화하지 않는 한 VM 인스턴스를 페이지 인스턴스에 가져 오는 방법이 표시되지 않습니다. – user373708

관련 문제