로케이터 패턴과 MVVM-Light 라이브러리를 사용하도록 변환하려는 기존 Silverlight 4 응용 프로그램이 있습니다.MVVM-Light Locator 패턴 및 재사용 가능한 UserControl
MvvmLocator 클래스는 각 뷰 모델에 대한 참조를 유지하며 각보기의 DataContext를 로케이터의 적절한 ViewModel에 바인딩 할 수 있습니다.
내 응용 프로그램은 탐색 프레임을 사용하므로 응용 프로그램의 각 페이지는 Content 프레임에로드되는 UserControl입니다.
각 페이지 뷰를 로케이터의 적절한 ViewModel에 바인딩하는 것이 얼마나 쉬운 지 알 수 있지만 내 문제는 여러 컨텍스트에서 재사용되는 자체 뷰 모델이있는 다른 UserControls가 있다는 것입니다. 컨트롤의 각 인스턴스가 동일한 궁극적 인 뷰 모델 인스턴스에 바인딩되면 문제가 발생합니다.
예를 들어 2 개의 사용자 컨트롤로 구성된 검색 페이지가 있습니다. 첫 번째는 몇 가지 상호 종속적 인 콤보 상자와 검색 버튼을 포함하는 검색 매개 변수 컨트롤입니다. 두 번째는 결과 그리드 자체입니다. 이 두 컨트롤을 포함하는 페이지의 뷰 모델은 두 컨트롤 사이의 통신을 처리합니다. 문제는이 검색 컨트롤이 다른 페이지에서도 사용되며 동일한보기 모델 인스턴스를 모두 사용하면 모든 종류의 골칫거리가 발생한다는 것입니다. 따라서 정상적인 "DataContext = {바인딩 ProductSearch, 소스 = {StaticResource Locator}}"는 궁금한 것 같습니다 ...
다른 사람이이 문제를 해결하거나 해결 방법을 알고 있습니까? 컨트롤을 사용하는 각 페이지에 대한 뷰 모델의 새 인스턴스를 만들 수있는 로케이터를 수정할 수 있습니다. 그렇지 않으면 모든 페이지 전환시 강제로 정리를 수행 할 수 있지만 페이지간에 상태를 저장할 수는 없습니다.
전 Silverlight 및 MVVM 세계에 새로운 것이므로 어쩌면이 모든 것이 어떻게 구성되어야하는지 또는 구석에 그림을 그려야할지 모르는 경우가 있습니다. 나는 잘 모르겠다. 나는 어떤 제안이라도 확실히 환영 할 것이다.
인터페이스가 존재한다는 것을 전혀 모릅니다. 감사! 그것은 여러 가지면에서 도움이됩니다. 그러나, 나는 여전히 재사용 가능한 UserControl의 DataContext를 바인딩하는 방법에 대한 질문을 가지고있다. 내가 생각한 것은 최상위 페이지에 대한 뷰 모델의 구성원으로 필요한 뷰 모델의 인스턴스를 만든 다음 페이지에서 참조 할 때 UserControls에 바인딩한다는 것입니다. 적어도 생성자에서 자식 뷰 모델 인스턴스를 매개 변수로 요구하는 페이지 뷰 모델에 대해서는이 작업을 수행 할 수 있습니다. 말이 돼? – user373708
나는 당신이 자식 UserControl 뷰가 매회 다시 만들어지면 괜찮은 해결책이라고 생각한다. 대신보기에 대한 참조를 작성하면 ViewModel을 다시 사용하는 것에 대해 걱정할 필요가 없습니다. 또한 특정 ViewModel을 요청할 때마다 새 인스턴스를 반환하도록 ViewModelLocator를 수정하여 뷰가 실수로 ViewModel을 다시 사용하지 않도록 할 수 있습니다. –
뷰에 대한 참조를 만드는 것에 대한 요지를 잘 모르겠습니다. 예를 들어, 다음 생성자가있는 뷰 모델이 있다고 가정 해 봅시다. SearchPageVM (SearchControlVM svm, ResultsControlVM rvm). 로케이터가이 인스턴스를 구성하면,이 인스턴스를 DataContext로 가져올 수있는 방식으로 컨트롤을 바인딩해야합니다.반면, UserControls VM 인스턴스를 만들면 모든 생성자를 변경하고 하위 뷰 VM을 다른 위치로 초기화하지 않는 한 VM 인스턴스를 페이지 인스턴스에 가져 오는 방법이 표시되지 않습니다. – user373708