2012-02-20 6 views
1

다른보기에서 사용하는 환자 목록의 사용자 컨트롤이 있습니다. 그러나 환자 중 하나를 선택하면 선택 항목이 사용자 정의 컨트롤의 인스턴스를 포함하는 모든보기로 전파됩니다. 각 뷰를 각 뷰에 대한 사용자 정의 컨트롤의 새 인스턴스를 인스턴스화하는 방법은 무엇입니까? C#을 사용하고 있습니다.MVVMLight UserControl 모델보기 - 각보기에 대해 사용자 컨트롤의 새 인스턴스를 만듭니다.

+0

현재 사용자 컨트롤을 다루는 방법을 보여주기 위해 code/XAML을 게시하십시오. – ken2k

+0

우리는 ken2k이 명시된대로 코드/XAML을 볼 필요가 있다고 생각하지만, siutuation에 대한 귀하의 견해가 둥글고 둥글게 보인다는 말처럼 말한 것입니다. "각보기가 각보기에 대해 사용자 정의 컨트롤의 새 인스턴스를 인스턴스화하게하려면 어떻게해야합니까?", 각 사용자 정의 컨트롤에 대해 새 인스턴스를 원하지 않습니까? 마찬가지로 모든 뷰에 대해 공유 모델이 필요합니다. 즉,보고있는 동작이 의미가 있거나 각 컨트롤에 대한 사용자 정의 컨트롤에 모델 바인딩 인스턴스가 필요하다는 의미입니다. –

+0

아래 제공된 솔루션을 참조하십시오. –

답변

3

당신이 말한 것을 추측하면, 당신의 정적 인스턴스 인 PatientViewModel이 로케이터에서 리턴한다고 가정 할 수 있습니다. 이 문제를 해결하려면 속성이 호출 될 때 뷰 모델의 새 인스턴스가 생성되어야합니다.

편집 : 로케이터 다른 인스턴스 방법

public class ViewModelLocator 
{ 
    public ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

      //if (ViewModelBase.IsInDesignModeStatic) 
      //{ 
      // // Create design time view services and models 
      // SimpleIoc.Default.Register<IDataService, DesignDataService>(); 
      //} 
      //else 
      //{ 
      // // Create run time view services and models 
      // SimpleIoc.Default.Register<IDataService, DataService>(); 
      //} 

     SimpleIoc.Default.Register<MainViewModel>(); 
    } 

    public MainViewModel Main 
    { 
     get 
     { 
      return ServiceLocator.Current.GetInstance<MainViewModel>(); 
     } 
    } 

     public MainViewModel StaticMain 
     { 
      get 
      { 
       return _staticMain ?? (_staticMain = new MainViewModel()); 
      } 
     } 
     private static MainViewModel _staticMain; 


     public MainViewModel NewMain 
     { 
      get 
      { 
       return new MainViewModel(); 
      } 
     } 

     public MainViewModel NewIocMain 
     { 
      get 
      { 
       return ServiceLocator.Current.GetInstance<MainViewModel>(Guid.NewGuid().ToString()); 
      } 
     } 

    public static void Cleanup() 
    { 
     // TODO Clear the ViewModels 
    } 
} 
  1. Main 속성은 인스턴스를 생성 Lauent의 SimpleIoc 컨테이너를 사용합니다. 이 컨테이너의 속성 중 하나는 모든 유형을 싱글 톤으로 처리한다는 것입니다. 따라서이 VM 생성 방법을 사용하면 뷰 전체에서 VM을 공유하게됩니다.

  2. 속성은 거의 동일하지만 Laurent의 컨테이너를 사용하는 대신보기간에 공유되는 VM의 정적 인스턴스를 보유합니다.

  3. 속성 NewMain은 모든 호출마다 새 VM을 만들기 때문에보기간에 VM이 공유되지 않습니다.

  4. 또한 NewIocMain 속성은 모든 호출시 새 VM을 만들고 따라서 뷰간에 VM이 공유되지 않습니다. 그러나 SimpleIoc 컨테이너는 작성된 인스턴스에 대한 참조를 보유합니다. 이 인스턴스는 자동으로 해제되지 않으므로 더 이상 필요하지 않으면 생성에서 사용한 키 (Guid)를 사용하여 컨테이너에서 인스턴스를 제거하려면 SimpleIoc.Default.Unregister(key)으로 호출해야합니다. 대신 사용

SimpleIoc 당신은 분명 다른 IOC 컨테이너 사용하도록 선택할 수 있습니다 - 예를 들어 유니티로 - 당신에게 더 큰 인스턴스를 생성하는 방법을 제어하는 ​​방법과 그들이 살고 있습니다. 이것을 제외하고, 나는 yor 케이스가 주어진 NewMain 접근을 선택할 것입니다.

+0

어떻게 새 것을 반환합니까? 코드 란 무엇입니까? –

+1

@edianga 편집을 참조하십시오. – AxelEckenberger

+0

IOC Container를 사용하면 어떤 이점이 있습니까?이 경우에는 S/W 개발에서 Unity가 필요합니까? –

관련 문제