2013-01-16 78 views

回答

1

TabControl可以像一些其他控件一样绑定到集合。以下是我在聊天消息程序中使用的tabcontrol的一个示例。

<TabControl ItemsSource="{Binding Path=Rooms, Mode=OneWay}" SelectedItem="{Binding Path=SelectedRoom, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" > 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Path=RoomName}" x:Name="Header" Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=DataContext}"/> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 

       //in here is where you put controls for what you want the tabs to look like. 

      </DataTemplate> 
     </TabControl.ContentTemplate> 
</TabControl> 

因此,在这个例子中,我有一个名为“房间”的自定义数据类型“聊天室”,这有一个像ROOMNAME它的属性的集合。每当用户创建一个新房间时,它将被添加到Rooms集合中,并创建一个新的tabitem。所以在我的视图模型:

private ObservableCollection<ChatRoom> _Rooms; 

public MainWindowViewModel() 
{ 
    this._Rooms = new ObservableCollection<ChatRoom>(); 
} 

public ObservableCollection<ChatRoom> Rooms 
{ 
    get { return this._Rooms; } 
} 
1

首先,我不是说我的做法是最好的一切可能的办法......但我只是想,因为我认为这很酷:)

你分享可以有TabControl 区域 ...所以你可以简单地导航到该地区的一些看法:) ...会发生什么?当您使用某个视图导航到TabControl区域时...该视图将作为新的TabItem添加。

当然有一些事情你必须先做。

  1. 您需要修改TabControl样式。您只需告诉TabControl它可以找到Tab项目的标题。当然,您可以将它添加到应用程序的资源。

    所以你需要TabItemStyle ......在这里你指定是头文本......这样的事情...

    <Style x:Key="MyTabItemStyle" TargetType="{x:Type TabItem}"> 
        <Setter Property="Header" Value="{Binding Content.DataContext.TabHeaderText,  RelativeSource={RelativeSource Self}}"/> 
        ... 
    

    而且在默认TabControlStyle使用它现在

    <Style TargetType="{x:Type TabControl}"> 
    <Setter Property="ItemContainerStyle" Value="{StaticResource MyTabItemStyle}"/> 
    ... 
    
  2. 你可以在任何你想要的地方定义TabControl区域。请注意,它应该使用我们之前定义的Style。

    <TabControl Regions:RegionManager.RegionName="MyRegion" ... /> 
    
  3. 现在好了,你可以浏览到你的观点,即区域......当然,你将不得不设置视图一些视图模型与字符串属性TabHeaderText的DataContext的...

现在它应该工作:)当然,我们正在谈论导航,所以你应该提供ViewModels [RegionMemberLifetime(KeepAlive = true)]属性:)我希望它可以帮助某人某一天。

1

您需要一个TabControl的区域适配器。我在此对色带控制,所以你可以从它启发:

public class RibbonRegionAdapter : RegionAdapterBase<Ribbon> 
{ 
    public RibbonRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory) 
     : base(regionBehaviorFactory) 
    { 
    } 

    protected override void Adapt(IRegion region, Ribbon regionTarget) 
    { 
     region.Views.CollectionChanged += (s, e) => 
     { 
      if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) 
      { 
       foreach (RibbonTabItem RibbonTab in e.NewItems) 
       { 
        regionTarget.Tabs.Add(RibbonTab); 
       } 
      } 

      if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove) 
      { 
       foreach (RibbonTabItem RibbonTab in e.OldItems) 
       { 
        regionTarget.Tabs.Remove(RibbonTab); 
       } 
      } 
     }; 
    } 

    protected override IRegion CreateRegion() 
    { 
     return new AllActiveRegion(); 
    } 
} 

在XAML:<Fluent:Ribbon prism:RegionManager.RegionName="{x:Static inf:RegionNames.RibbonRegion}"/>

添加你需要这样的标签:

IRegion RibbonRegion = _regionManager.Regions[RegionNames.RibbonRegion]; 
RibbonRegion.Add(YourTabItemView); 

RegionNames仅仅是一类我infrastructe project:

public class RegionNames 
{ 
    public static string RibbonRegion = "RibbonRegion"; 
} 

希望能帮到

相关问题