2011-02-07 2 views
1

Привет, я создаю simpel MDI в микросхеме калибр примерно так: http://devlicio.us/blogs/rob_eisenberg/archive/2010/10/19/caliburn-micro-soup-to-nuts-part-6c-simple-mdi-with-screen-collections.aspx.Caliburn Micro simple MDI

Каждый элемент табуляции идентифицируется идентификатором (идентификатор - обозначение Displayname). Мне нужно открыть только один элемент вкладки для каждого элемента id.Tab - это пользовательский элемент управления.

Tab пункт вид модели класса здесь:

[Export(typeof(ITabChatViewModel))] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
public class TabChatViewModel : Screen, IViewModelIdentity, 
    IPartImportsSatisfiedNotification, 
    ITabChatViewModel, IHandle<IRp>, IHandle<IDetailData> 
{...} 

Так что, если я активировать вкладку элемента в оболочке хранить вкладку ID в списке.

Мне нужно что-то удалить идентификатор табуляции из списка, когда элемент табуляции деактивирован.

Shell вид модель Класс:

[Export(typeof(IChatShellViewModel))] 
public class ChatShellViewModel : 
    Conductor<IScreen>.Collection.OneActive, 
    IChatShellViewModel 
{ 
    //consist active tab item 
    List<string> ActiveTabItems { get; set; } 

    public ChatShellViewModel() 
    { 
     ActiveTabItems=new List<string>(); 
    } 

    public void OpenChatTab(IScreen screen) 
    { 
     if(!ActiveTabItems.Contains(screen.DisplayName)) 
     { 
      ActivateItem(screen); 
      ActiveTabItems.Add(screen.DisplayName); 
     } 

    } 


} 

Shell вид:

<Window x:Class="Spirit.Views.ChatShellView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro" 
     Height="545" 
     Width="680"> 
    <DockPanel> 
     <TabControl x:Name="Items"> 
      <TabControl.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding DisplayName}" 
            VerticalAlignment="Center"/> 
         <Image Source="/images/icons/close.png" 
             Margin="8,4,4,4" 
             Height="16" 
             Width="16" 
             HorizontalAlignment="Right" 
             VerticalAlignment="Center" 
             cal:Message.Attach="[Event MouseLeftButtonDown]=[Action CloseItem($dataContext)]"/> 
        </StackPanel> 
       </DataTemplate> 
      </TabControl.ItemTemplate> 
     </TabControl> 
    </DockPanel> 
</Window> 

я могу добиться этого поведения с классом агрегатора событий и опубликовать сообщение из вкладки элемента вида модели класса на оболочечном виде модель класса когда элемент табуляции деактивирован.

Но я хотел бы использовать что-то более простое. Например, элемент вкладки может вызывать метод просмотра оболочки, когда он деактивирован.

Любые советы? Спасибо

+0

Вы должны использовать кнопку вместо изображения + mousedown (а затем стилизовать ее), потому что она обрабатывает касание, стилусом и мышью взаимодействие с событием «Click» - оно также обрабатывает сценарий, где mousedown происходит на кнопке, но mouseup doesnt. –

ответ

1

Класс Screen (который предоставляется каркасом), который вы наследуете TabChatViewModel от, определяет метод TryClose. Этот метод пытается закрыть текущий экран, спросив его родителя (который в вашем случае будет проводником ChatShellViewModel) или попросит закрыть его.

Так что все, что вам нужно сделать, это позвонить TryClose() изнутри TabChatViewModel, когда вызывается операция закрытия.

Смежные вопросы