2015-01-15 4 views
0

На данный момент у меня есть рабочие вкладки, и они открываются и закрываются должным образом. Я пытаюсь реализовать функцию «Закрыть все» и «Закрыть все, кроме этой вкладки», задавался вопросом, как я могу это сделать? Вкладка «Мои закладки» инициализируются в моем ShellViewModel.WPF caliburn Управление экраном и вкладкой

Текущий TabsView.xaml

<Style TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="SnapsToDevicePixels" Value="true"/> 
    <Setter Property="OverridesDefaultStyle" Value="true"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
       <StackPanel Name="Panel" Background="#88DDDDDD" SnapsToDevicePixels="True" Orientation="Horizontal" Margin="1 0" cal:Message.Attach="[Event MouseDown] = [Action Show($dataContext)]"> 
        <TextBlock Text="{Binding DisplayName}" VerticalAlignment="Center" TextAlignment="Right" FontWeight="Bold" > 
         <TextBlock.ContextMenu> 
           <ContextMenu> 
           <MenuItem Header="Close All Tabs" cal:Message.Attach="[Event Click] = [Action CloseTabs($this)]"/> 
           <MenuItem Header="Close All But This" cal:Message.Attach="[Event Click] = [Action CloseAllButThis]"/> 

          </ContextMenu> 
         </TextBlock.ContextMenu> 
        </TextBlock> 
        <Button Background="Transparent" cal:Message.Attach="[Click] = [Close($this)]" BorderThickness="0" VerticalAlignment="Center"> 
         <ContentControl ContentTemplate="{StaticResource Icons.CloseButtonSmall}" Background="#900" Width="10" Height="10" Margin="3" VerticalAlignment="Center"/> 
        </Button> 
       </StackPanel> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="true"> 
         <Setter TargetName="Panel" Property="Background" Value="#DDD"/> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="false"> 
         <Setter Property="Foreground" Value="#093"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

TabsViewModel.cs

private readonly IEventAggregator _events; 

public List<IScreen> Items { get; private set; } 

public WorkTabsViewModel(IEventAggregator events) 
{ 
    _events = events; 
    _events.Subscribe(this); 
} 

public void Close(IScreen tab) 
{ 
    if (tab.DisplayName == "Settings") 
    { 
     var settingsViewModel = tab as SettingsViewModel; 
     if (settingsViewModel != null) 
     { 
      tab.TryClose(); 
     } 
    } 
    else 
    { 
     tab.TryClose(); 
    } 
} 

public void Show(IScreen screen) 
{ 
    _events.PublishOnUIThread(new ShowTabEvent(screen)); 
} 

public void Handle(ScreenChangeEvent screenChangeEvent) 
{ 
    Items = screenChangeEvent.Tabs.Where(x => Array.IndexOf(HiddenTabs, x.GetType().Name) < 0).ToList(); 
    NotifyOfPropertyChange(() => Items); 
} 

ответ

1

В вашей ViewModel вы можете сделать следующее:

public class WorkTabsViewModelpublic extends Conductor<IScreen>.Collection.OneActive 
{ 
    // .... 

    void CloseAll() { 
     foreach (IScreen tab in Items) 
     { 
      tab.TryClose(); 
     } 
    } 

    // .... 
} 

Затем на ваш взгляд, вы можете добавить кнопку который будет вызывать этот метод при нажатии

<Button x:Name="CloseAll">Close All Tabs</Button> 

Пока ваша ViewModel расширяет Conductor<IScreen>.Collection.OneActive (или что-то подобное), это будет проходить через все ваши открытые вкладки и попытаться их закрыть.