2010-03-26 4 views
3

다른보기 또는 뷰 모델에서 내 viewmodels에 매개 변수를 전달하는 방법을 알 수 없습니다.ViewModels (Prism)에 매개 변수 전달

예를 들어 Customers라는보기가 있습니다. 격자가 안에 있고, 격자를 두 번 클릭하면 새로운보기가 나타나서 해당 고객의 데이터를 편집 할 수 있습니다. 그러나 데이터를 편집하는 View (Model)는 내부에 매개 변수를 전달할 수없는 경우 어떤 고객이 열어야하는지 어떻게 알 수 있습니까?

EventAggregator는 당연히 내가보기 엔 각각 수 백 개의 eventargs를 생성 할 수 없기 때문에 문제가되지 않습니다. 게다가, 그것은 비열한 해결책입니다.

CustomerDataView custView = new CustomerDataView(customerId, currentContext); 
manager.Regions[RegionNames.Sidebar].AddAndActivate(custView); 

당신이 특정 솔루션에 대해 어떻게 생각하십니까 :

지금까지 내가 가지고 올 수 있었다? 이것이 정상적으로 수행되는 방식입니까? 내가 싫어하는 것은 Unity에 의한 자동 종속성 삽입을 포기한다는 사실입니다.

답변

3

MVVM에서 M이 사용하는 기능입니다. 예 : 고객 그리드와 고객 편집기가 공유하는 모델 (생성자의 Unity에 의해 삽입 됨)을가집니다. gird에서 두 번 클릭하면 모델의 Customer 인스턴스가 설정됩니다. 에디터 뷰가 생성되면 viewmodel은 모델로부터 Customer를 얻습니다.

당신이 언급 한 자동 의존성 주입의 손실에 관해서는 CreateChildContainer() 메소드를 사용할 수 있습니다. 예 :

using (var childContainer = _container.CreateChildContainer()) 
{ 
    childContainer.RegisterInstance(customerId); 
    var custView = childContainer.Resolve<CustomerDataView>(); 
    manager.Regions[RegionNames.Sidebar].AddAndActivate(custView); 
} 
5

또는 매개 변수 재정의를 지원하는 최신 빌드로 Unity를 업그레이드 할 수 있습니다.

MyType mt = container.Resolve<MyType>(
         new ParameterOverride("customerId", customerId)); 

이것은 내가 한 것입니다. 우리는 하위 컨테이너가 부모에 대한 순환 참조를 유지 했으므로 적절하게 수집 (누출 된 메모리)하지 않으므로이 방법을 업그레이드하고 선택했습니다.

+0

parameteroverride가 맞춤 클래스 인스턴스 인 경우 코드가 올바르게 작동하지 않지만 문자열 값 또는 int 값 인 경우 코드가 올바르게 작동합니다. 왜요? – huoxudong125