2013-01-16 75 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"; 
} 

希望能幫到

相關問題