2012-04-12 3 views
0

글쎄, 지금 당장 내 머리를 긁적 거리고 있습니다. 하지만 내 문제에 대한 해결책을 찾지 못했습니다. 내가 가진 것은 MainViewModel과 ObservableCollection TabItems입니다. MainViewModel은 TabControl을 호스트하는 MainView (User Control)의 DataContext로 설정됩니다. tabcontrol은 TabItems 컬렉션에 바인딩됩니다. tabcontrol의 내용은 ReportItems User Control이됩니다.탭 내부에서 탭 컨트롤에 탭 추가하기

이 설정은 기본적으로 SSRS의 UI보고를위한 보고서입니다. 첫 번째 탭에는 사용자가 보고서 매개 변수를 선택할 수있는 몇 개의 목록 상자가 표시되는 보고서 목록이 포함되어 있습니다. 매개 변수를 선택한 후 사용자가 버튼을 클릭하면 보고서가 생성되고 보고서 호스트가있는 탭 컨트롤에 탭이 추가됩니다.

탭에서 보고서를 선택하려고하는 이유는 기본보기가 아니기 때문에 선택해야 할 매개 변수가 많고 목록 상자를 MainView에 추가하면 tabcontrol에 남은 공간이 덜보고 사용자가 보고서를 보려면 아래로 스크롤해야합니다.

내 디자인에 결함이 있는지는 잘 모르겠지만 새 ReportItemViewModel을 추가하여 TabItem 컬렉션에 추가하는 방법을 찾고 싶었습니다. 즉, 하위 탭에서 ReportItemViewModel 객체를 MainViewModel에 보내고 colection에 추가하여 형제를 추가 할 수 있습니다.

정적 컬렉션을 사용하여 그렇게 생각했지만 내 OnPropertyChange 메서드를 호출하지 않습니다. 또한 컬렉션이 정적이 아니기 때문에 컬렉션에 객체를 추가 할 수 없으므로 MainViewModel에서 정적 메서드를 사용하면 도움이되지 않습니다.

나는 그 자체를 시작하는 방법에 집착하고 있기 때문에 여기에 어떤 코드도 게시하지 않을 것입니다. 나는 다른 게시물 here 보았지만 그것을 사용하는 방법을 알아낼 수 없습니다.

대단히 죄송합니다. 질문을 명확히하고 싶습니다.

나는 더 나은 디자인을 얻을 수 있다면 어떤 제안이든 열려 있습니다. 나는 필사적이고 어떤 도움을 주시면 감사하겠습니다.

+0

추가 프로세스를 위해 UI를 호스팅하기 위해 팝업 또는 확장기를 사용할 수 있습니다.그렇게하면 화면 부동산을 사용하지 않고 ReportItemViewModel에 논리를 추가하지 않아도됩니다. – AlexDrenea

+0

Popup은 내가 생각해 보았던 부분 이었지만, 제자리를 찾지 않는듯한 느낌이 들었습니다. 확장기에 대해서는 여러 보고서가있는 것처럼 구현하는 방법을 잘 모릅니다. 각 보고서마다 비활성화/보이지 않는 모드로 확장기가 하나 있으며 보고서 선택을 기준으로 활성화/표시되도록 설정해야합니다. 당신은 정교 할 수 있습니까? –

+0

당신은 화면의 부동산을 보존하기를 원하기 때문에 메인 뷰가 아니라 탭에 목록이 있다고하셨습니다. 주 뷰에서 확장기를 사용하면 축소 된 보고서에 충분한 공간을 제공 할 수 있고 확장 할 때 새 보고서를 추가 할 수있는 충분한 공간이 제공됩니다. – AlexDrenea

답변

3

당신의 ObservableCollection에 새 항목을 추가하여 MainViewModelICommand하고는 RelativeSource 그래서 당신의 MainViewModel이

ObservableCollection<IViewModel> TabItems 
IViewModel SelectedTabItem 
ICommand AddTabCommand 

AddTabCommand을했을 TabItem

내에서 명령을 찾을 바인딩을 사용 추가 기본적으로 수행합니다

void AddTab(IViewModel newItem) 
{ 
    TabItems.Add(newItem); 
    SelectedTabItem = newItem; 
} 

당신의 UI는 또 다른 대안은 MVVM 빛의 Messenger 또는 Microsoft 프리즘의 EventAggregator은/브로드 캐스트 이벤트에 가입하도록 이벤트 시스템의 어떤 종류를 사용하는 것입니다이

<DataTemplate DataType="{x:Type local:SelectReportViewModel}"> 
    <Grid> 
     ... 
     <!-- Use the CommandParameter property to pass specified ReportItemViewModel to open --> 
     <Button Command="{Binding DataContext.AddTabCommand, 
       RelativeSource={RelativeSource AncestorType={x:Type TabControl}}}" /> 
     ... 
    </Grid> 
</DataTemplate> 

<TabControl ItemsSource="{Binding TabItems}" /> 

의 라인을 따라 뭔가를 보일 것이다.

MainViewModelAddTabEvents에 가입하고 SelectReportViewModel은 새 탭을 추가해야 할 때마다 해당 이벤트를 브로드 캐스팅합니다. 관심이 있다면 내 블로그 기사에 대한 간략한 요약을 communication between ViewModels에 있습니다.

+0

이것은 유망 해 보입니다. 실제로 WPF를 처음 접했을 때 실제로 이와 같은 것을 찾고 있었지만 결코 들어 본 적이 없습니다. 한 VM에서 다른 VM으로 통신하는 방법에 대해서는 전혀 생각하지 못했습니다. 구현하여 어떻게 진행되는지 알려드립니다. –

+0

최고 ... 작동 ... 이벤트 수집기 패턴을 사용했습니다 ... 매력처럼 작동했습니다 ... 많은 감사드립니다 ... :) –