2016-06-17 2 views
0

이 스레드에서 : Can anybody provide any simple working example of the Conductor<T>.Collection.AllActive usage? 나는 대답의 일부를 가졌지 만 여전히 혼란 스럽습니다.ShellViewModel에서 ViewModels 참조가 있습니다. Caliburn.Micro

모든보기 모델을 내 ShellViewModel로 참조하여 ContentControls를 열고 닫을 수 있지만 모든 내용을 생성자에 삽입하지 않고 간단히 참조하고자합니다.

해답에서는 ShellViewModel의 생성자에 인터페이스를 삽입하는 것이 좋습니다. 그렇게하면 모든 인터페이스를 구현하는 클래스에 모든 ViewModel을 삽입해야합니까?

public MyViewModel(IMagicViewModelFactory factory) 
{ 
    FirstSubViewModel = factory.MagicallyGiveMeTheViewModelIWant(); 
    SecondSubViewModel = factory.MagicallyGiveMeTheViewModelIWant(); 
    ThirdSubViewModel = factory.MagicallyGiveMeTheViewModelIWant(); 

    Items.Add(FirstSubViewModel); 
    Items.Add(SecondSubViewModel); 
    Items.Add(ThirdSubViewModel); 
} 

또한, 나는 내보기 모델의 인스턴스를 얻을 수> IoC.Get <을 거치지 않아도 싶습니다, 나는 내가 잘못 아니에요 경우는 IOC의의 원칙을 위반 생각합니다. 다른 몇 가지 예에서는 필요에 따라 새 viewModel을 만듭니다.하지만 이러한 경우에 IoC를 사용하는 이유는 무엇입니까? 특히 이러한 새로운 ViewModel 내부에 서비스를 주입해야하는 경우가 있습니다. 내 쉘보기에서

, I에 의해 내 껍질보기 모델에 바인딩 3 개 가지 영역과 레이아웃이 있습니다 Conductor.Collection.AllActive을 확장 내 ShellViewModel에서

<ContentControl x:Name="Header" 
        Grid.ColumnSpan="3"/> 
<ContentControl x:Name="Menu" 
        Grid.Row="1"/> 
<ContentControl x:Name="Main" 
        Grid.ColumnSpan="3"/> 

를,이 같은 세 영역을 참조 :

public Screen Menu { get; private set; } 
public Screen Header { get; private set; } 
public Screen Main { get; private set; } 
나는과 같이 변경할 수 있도록하고 싶습니다

:

Menu = Items.FirstOrDefault(x => x.DisplayName == "Menu"); 
Header = Items.FirstOrDefault(x => x.DisplayName == "Header"); 
Main = Items.FirstOrDefault(x => x.DisplayName == "Landing"); 

모든 ViewModel의 생성자에 DisplayName이 설정되어 있습니다.

내가 GetChildren하지만이 시도했다()

foreach (var screen in GetChildren()) 
     { 
      Items.Add(screen); 
     } 

내가 뭔가를 분명 실종 비어?

미리 감사드립니다.

답변

0

마지막으로 나는 스스로 답변을 찾을 수있었습니다. AppBootstrapper에 모두 들어 있습니다!등록 된 AppBoostrapper에서 다음

public class ViewModelBase : Screen 
{ 
    private IShell _shell; 

    public IShell Shell 
    { 
     get { return _shell; } 
     set 
     { 
      _shell = value; 
      NotifyOfPropertyChange(() => Shell); 
     } 
    } 
} 

:

내가합니다 (ViewModels가 ShellViewModel에서 탐색을 실행할 수 있도록)가 전혀 IShell 속성을 가질 수 있도록 지금처럼 내 화면에 대한 ViewModelBase을 만들어 결국 그들은 다음과 같이 :

IEnumerable<ViewModelBase> listScreens = GetAllScreenInstances(); 

container.Instance<IShell>(new ShellViewModel(listScreens)); 
:
container.Singleton<ViewModelBase, SomeViewModel>(); 
container.Singleton<ViewModelBase, AnotherViewModel>(); 
container.Singleton<ViewModelBase, YetAnotherViewModel>(); 

는 내 ShellViewModel의의 ctor에 PARAM로 전달할는 IEnumerable을 생성

protected IEnumerable<ViewModelBase> GetAllScreenInstances() 
{ 
    return container.GetAllInstances<ViewModelBase>(); 
} 
protected IShell GetShellViewModelInstance() 
{ 
    var instance = container.GetInstance<IShell>(); 
    if (instance != null) 
     return instance; 

    throw new InvalidOperationException("Could not locate any instances."); 
} 

가 여기 내 ShellViewModel의 ctor에의 모습입니다 :

다음 완전성을 위해 각 ViewModels

foreach (ViewModelBase screen in listScreens) 
{ 
    screen.Shell = GetShellViewModelInstance(); 
} 

에 IShell을 통과, 여기 내 GetAllScreenInstances()와 GetShellViewModelInstance()이다

public ShellViewModel(IEnumerable<ViewModelBase> screens) 
{   
    Items.AddRange(screens); 
} 

앞으로 도움이되기를 바랍니다.

관련 문제