2016-10-02 2 views
-1

런타임시 TabItem이 동적으로 작성되는 TabControl을 작성하려고합니다. TabItem은 ViewModel과 연결되어야합니다. 이 뷰 모델은 TabItem 내부에서 컨텐트를 만드는 방법을 알고있는 인터페이스를 지원합니다. 따라서 기본적으로 TabItem은 런타임에 뷰 모델에 의해 결정되는 모든 콘텐트 제어를 수용 할 수 있습니다. TabControl.ContentTemplate 또는 ControlTemplate 및 ItemTemplate을 사용하여 다른 접근 방식을 시도했지만 그 중 아무 것도 작동하지 않습니다. 템플릿 접근 방식은 디자인 타임에 TabItem 내부의 내용 유형을 알아야 자신을 렌더링 할 수 있습니다. 연결된 데이터 컨텍스트의 속성 바인딩이 제대로 작동하지만 콘텐츠 컨트롤이 표시되지 않습니다. 새 클래스 MyTabItem : TabItem을 파생시키고 사용자 지정 콘텐츠를 만들고이를 MyTabItem의 콘텐츠와 연결할 수 있습니까? 보기 모델이 TabItems의 내용을 만들 수있는 일반적인 방법이 필요합니다.WPF TabControl (ViewModel 사용 가능) TabItem 컨텐츠 작성

+0

ok .. CustomTabItem : TabItem을 파생시킬 수 있었고 생성자에서 뷰 모델을 전달하여 해당 내용을 만들 수있었습니다. ViewModel은 content 요소를 생성하고 그것을 tabitem의 내용에 할당합니다. 그러한 접근 방식의 장단점은 무엇입니까? 나는 stackoverflow 에이 방법과 어떤 대답을 참조하십시오. viewModel이 tabItems 컨텐츠를 생성하도록 허용하는 것은 매우 표준적인 문제처럼 보입니다. –

답변

0

TabControl에 동적으로 추가 될 수있는 유형마다 DataTemplate을 지정할 수 있습니까? 그렇다면이 작품이 당신에게 도움이 될까요?

합니다 (TabControl 우리가 둘 다 지정하지 않았기 때문에. 이것은) 모두 동일 DataTemplate 탭 헤더의 ItemTemplate (템플릿) 선택한 탭의 내용을 내부에 표시되는 ContentTemplate (템플릿을 찾는합니다, 그래서 WPF는 단순히 나무를 걸어서 우리의 Grid.Resources에서 두 개의 동일한 템플릿을 찾고 있습니다. 각각 다른 템플릿을 사용하려면 ItemTemplate에 사용할 템플릿을 명시 적으로 지정하거나 DataTemplateSelector을 사용하십시오 또는 이와 유사).

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <Grid.Resources> 
     <DataTemplate DataType="{x:Type local:DescribableOne}"> 
      <Grid Background="Red"> 
       <TextBlock Text="{Binding Description}" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
      </Grid> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:DescribableTwo}"> 
      <Grid Background="Blue"> 
       <TextBlock Text="{Binding Description}" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
      </Grid> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:DescribableThree}"> 
      <Grid Background="Green"> 
       <TextBlock Text="{Binding Description}" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
      </Grid> 
     </DataTemplate> 
    </Grid.Resources> 

    <StackPanel Orientation="Horizontal"> 
     <Button Command="{Binding AddOne}">Add One</Button> 
     <Button Command="{Binding AddTwo}">Add Two</Button> 
     <Button Command="{Binding AddThree}">Add Three</Button> 
    </StackPanel> 

    <TabControl Grid.Row="1" ItemsSource="{Binding DynamicallyGeneratedTabs}"/> 

</Grid> 

모델 :

public class TabControlViewModel 
{ 
    public TabControlViewModel() 
    { 
     AddOne = new RelayCommand(DoAddOne); 
     AddTwo = new RelayCommand(DoAddTwo); 
     AddThree = new RelayCommand(DoAddThree); 
     DynamicallyGeneratedTabs = new ObservableCollection<IDescribable>(); 
    } 

    public ICommand AddOne { get; } 
    public ICommand AddTwo { get; } 
    public ICommand AddThree { get; } 

    public ObservableCollection<IDescribable> DynamicallyGeneratedTabs { get; } 

    private void DoAddOne() 
    { 
     DynamicallyGeneratedTabs.Add(new DescribableOne()); 
    } 

    private void DoAddTwo() 
    { 
     DynamicallyGeneratedTabs.Add(new DescribableTwo()); 
    } 

    private void DoAddThree() 
    { 
     DynamicallyGeneratedTabs.Add(new DescribableThree()); 
    } 
} 

public interface IDescribable 
{ 
    string Description { get; } 
} 

public class DescribableOne : IDescribable 
{ 
    public DescribableOne() 
    { 
     Description = "One"; 
    } 

    public string Description { get; } 
} 

public class DescribableTwo : IDescribable 
{ 
    public DescribableTwo() 
    { 
     Description = "Two"; 
    } 

    public string Description { get; } 
} 

public class DescribableThree : IDescribable 
{ 
    public DescribableThree() 
    { 
     Description = "Three"; 
    } 

    public string Description { get; } 
} 
+0

답변을 주셔서 감사합니다 @ 사이먼. 게시 한 예제에서 디자인 타임에 데이터 템플릿의 내용 유형 (TextBlock)을 알 수 있습니다. 유형이없는 곳. 좋아, 내 탭 항목 그래프와 테이블 같은 다른 하위 컨트롤을 표시해야합니다. 그러나 얼마나 많은 그래프가 디자인 타임에 표시되는지는 모르지만 ViewModel에 따라 다릅니다. TextBlock 대신 ContentControl을 지정하려고하지만 작동하지 않는 것 같습니다. 예 : this