2014-11-19 3 views
1

활성화되고 나는 Conductor<Workspace>.Collection.OneActive에서 상속 ShellViewModelActiveItemx:Name 속성을 가진 ContenControl이있는 ShellView 있습니다.화면이

WorkspaceScreen을 상속합니다.

ShellViewModel

public class ShellViewModel : Conductor<Workspace>.Collection.OneActive 
{ 
    ShellViewModel(IEnumerable<Workspace> items) 
    { 
     this.Items = items; 
     // below is not how I activate, just an example for descriptive purposes 
     this.ActivateItem(this.Items.FirstOrDefault(e => e.Id == "Container")); 
    } 
} 

위에서 ShellView

<ContentControl x:Name="ActiveItem" /> 

Items 컬렉션을 성공적으로 Workspace의 객체로 채워되고 object of Workspace 성공적으로 ContentControlActivateItem에 표시됩니다 ca이다. lled.

ActiveItemScreen이며 ObservableCollection<PanelViewModel>을 포함하는 Conductor<Workspace>이 아닙니다. 내 ContainerViewItemsControl이고 ItemsSourcePanelViewCollection에 속하며 템플릿 재 지정은 'UniformGrid'를 사용하여 표시합니다.

ContainerViewModel

public class ContainerViewModel : Screen 
{ 
    // get/set implantation missed for brevity 
    public ObservableCollection<PanelViewModel> PanelViewCollection 
    { 
     get; 
     set; 
    } 

    public void AddPanelViewModel() 
    { 
     var @new = new PanelViewModel(); 
     this.PanelViewCollection.Add(@new); 
    } 
} 

ContainerView는

<ItemsControl ItemsSource="{Binding PanelViewCollection}> 
    <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <UniformGrid/> 
      </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

는 내 ContainerViewButton 컬렉션에 추가됩니다 ContainerViewModelnew PanelViewModelAddPanelViewModel 함수를 호출하고 그것은에 표시된다 ContainerView.

이 시점까지 모든 것이 제대로 작동하는 것 같습니다.

Conductor<Workspace>.Collection.OneActive에서 PanelViewModel 상속 및 PanelView는 ActiveItem`x:Name의 속성을 가진 ContenControl있다.

PanelViewModel

public class PanelViewModel : Conductor<Workspace>.Collection.OneActive 
{ 
    PanelViewModel(IEnumerable<Workspace> items) 
    { 
     this.Items = items; 
     // below is not how I activate, just an example for descriptive purposes 
     this.ActivateItem(this.Items.FirstOrDefault(e => e.Id == "PanelA")); 
    } 
} 

의 PanelViewPanelView가 표시되는 동안

<StackPanel> 
    <TextBlock Text="There be treasure here!" /> 
    <ContentControl x:Name="ActiveItem" /> 
</StackPanel> 

(I 볼 여기에 보물)을 ActiveItem이 표시 나는이 함께 할 수있는 뭔가가 생각되지 않는 활성화, WorkspaceOnActivate 메서드가 활성화되었으므로 호출되지 않습니다.

내가 무엇을 놓쳤는가?

나는 그것을 검토 경사의 나 사람들에 대한 Git repo에 예를 저지른

편집 :

+0

작업 영역의 OnActivate 메서드가 호출되지 않았는지 확인하는 방법은 무엇입니까? OnActivate를 재정의 했습니까? 활성화 된 상태를보기 위해'PanelViewModel'을 디버깅 할 가치가 있습니다. – Chris

+1

@Chris - 네,'WorkActivate' 메소드를 오버라이드 OnActivate 메소드를 호출하여 호출되는지 확인합니다. 또한 검토 할 시간이 있다면 Git repo (게시물의 링크)에 예제 코드를 커밋했습니다. 모든 필수 코드를 생략했습니다. 'PanelViewModel'이 활성화되어 있지 않은 것처럼 보입니다,'IsActive = false',/is 이슈입니까? – Unflux

+0

그런데 문제가 될 수 있다고 생각합니다. 나는 달려야한다. 그러나 내가 시간을 가지면 더 많이보고, 시험해 볼 것이다. – Chris

답변

2

더 읽은 후 나는 OP 설명 내 구현 두 가지 문제가 있었다 생각합니다.

  1. ContainerViewItemsControl.ItemTemplateDataTemplate이 잘못되었습니다. 나는 ViewModel보다는 View를 표시하는 것으로 보입니다.
  2. ContainerView은 부분적으로 Screen 개의 수명을 관리 했으므로 Conductor에서 상속 한 것이어야합니다.

동일한 또는 유사한 문제가 발생할 수있는 사람은 누구나 Git repo에 대한 작업 구현을 약속했습니다.

+0

잘 고쳤다 니 다행이다. D – Chris

+1

@ 크리스 - 고마워. 그리고 올바른 방향으로 나를 가르쳐 줘서 고마워. – Unflux

+0

AScreen \ AConductor \ ASubConductor, AScreen이 ACApplication을 통해 'ContentControl'을 통해 일부 바인딩 된 공용 속성을 설정하는 경우 ASubreen \ Aconductor \ ASubConductor가 발생하면 ** ASubConductor **가 활성화되지 않습니다. AConductor가이를 활성화합니다. 제대로 작동하려면 AConductor를 속성으로 설정하는 것만으로는 충분하지 않습니다. AScreen도 * 수동 * 활성화해야합니다. HTH – superjos