2017-03-07 1 views
1

MainView 안에 TabControl 영역이있는 다른보기를 등록하려면 Prism RegionManager을 사용하고 있습니다.프리즘을 사용하여 동적으로 추가 된 탭 항목 닫기 - WPF

MainView.xaml는 MainViewViewModel에서

<TabControl regions:RegionManager.RegionName="MainViewTabRegion"> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <DockPanel Width="Auto"> 
        <Button Command="{Binding DataContext.DataContext.CloseTabCommand, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" 
          CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" 
          Content="X" 
          Cursor="Hand" 
          DockPanel.Dock="Right" 
          Focusable="False" 
          FontFamily="Courier" 
          FontWeight="Bold" 
          Margin="4,0,0,0" 
          FontSize="10" 
          VerticalContentAlignment="Center" 
          Width="15" Height="15" /> 

          <ContentPresenter Content="{Binding DataContext.DataContext.HeaderText, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" /> 
       </DockPanel> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
    </TabControl> 

나는 같은 기본 클래스에 다른보기를 추가하고 있습니다.

MainViewViewModel.cs :

private void AddProjectView() { 
    var view = _container.Resolve<ProjectSettingsView>(); 
    var dataContext = _container.Resolve<ProjectSettingsViewModel>(); 
    dataContext.HeaderText = "test header txt"; 
    view.DataContext = dataContext; 
    _regionManager.RegisterViewWithRegion("MainViewTabRegion",() => view); 
} 

내가 볼 수있는 새 탭 항목을 추가 할 수 있습니다.

위의 XAML 코드에서 <TabControl.ItemTemplate>의 탭 항목을 닫고 ProjectSettingsViewModelCloseCommand의 닫기 단추를 추가하고 TabItem을 보세에 연결하는 방법은 무엇입니까?

ProjectSettingsViewModel.cs는

private void OnExecuteCloseCommand(object tabItem) { 
    //Close this TabItem 
} 

답변

4

바인드 TabItemDataContextButtonCommandParameter 특성 : 그런 다음 뷰 모델에서이 같은보기를 제거 할 수

<Button Command="{Binding DataContext.DataContext.CloseTabCommand, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" 
          CommandParameter="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" 
          Content="X" 
          Cursor="Hand" 
          DockPanel.Dock="Right" 
          Focusable="False" 
          FontFamily="Courier" 
          FontWeight="Bold" 
          Margin="4,0,0,0" 
          FontSize="10" 
          VerticalContentAlignment="Center" 
          Width="15" Height="15" /> 

:

public class ProjectSettingsViewModel 
{ 
    private readonly IRegionManager _regionManager; 

    public ProjectSettingsViewModel(IRegionManager regionManager) 
    { 
     _regionManager = regionManager; 
     CloseTabCommand = new DelegateCommand<object>(OnExecuteCloseCommand); 
    } 

    private void OnExecuteCloseCommand(object tabItem) 
    { 
     _regionManager.Regions["MainViewTabRegion"].Remove(tabItem); 
    } 

    public DelegateCommand<object> CloseTabCommand { get; } 
} 
1

내 인 Pluralsight 물론 "탭 컨트롤을 마스터 프리즘 문제 & 솔루션"이 커버. 여기서 솔루션을 확인할 수 있습니다. https://app.pluralsight.com/library/courses/prism-mastering-tabcontrol/table-of-contents

기본적으로 모든 작업을 수행하는 TriggerAction을 만들어야합니다. 단순한. VM에는 아무 것도 필요하지 않습니다.

+1

아무튼 링크가 있습니다 솔루션에 도달하려면 가입해야합니까? 나는 그가 무료 평가판에 가입하도록 요구하는 링크가이 사이트에서 좋은 형태라고 생각하지 않습니다. –

+1

사실 [here] (https://meta.stackoverflow.com/a/272885/7604843) 상업 소스에 연결하는 경우 이미 완성 된 답변을 보완해야합니다. 무료 답변과 관련된 자료. –

+0

그는 무료 답변을 원하며 대답을 무료로 얻을 수있는 무료 평가판을 얻을 수 있습니다. 이미 구독하고 있다면 더 쉽습니다. 대답은 거기에 있으며, 재판에 등록하는 것이 솔루션을 얻는 데 너무 많이 요청하면 다른 곳에서 답을 찾을 수 있습니다. –

2

IRegionManager에 대한 참조 만하면됩니다. 그런 다음 뷰가 속한 Region을 가져온 다음 Region에서 Remove를 호출하고 tabItem 참조를 전달하여 제거합니다.

예는 :

private void OnExecuteCloseCommand(object tabItem) { 
    regionManager.Regions["MainViewTabRegion"].Remove(tabItem); 
} 

당신은 실제로 당신의 MainViewViewModel이를 배치하고 DataTemplate을에 결합 할 수 있습니다, 당신은 각 탭 항목의 뷰 모델에 가까운 명령을 다시 할 필요가 없습니다.