Wpf 如何以编程方式将选项卡项添加到prism中的选项卡控件

Wpf 如何以编程方式将选项卡项添加到prism中的选项卡控件,wpf,mvvm,prism,mef,Wpf,Mvvm,Prism,Mef,我正在将Prism与MEF一起使用,我想动态地将选项卡项添加到选项卡控件中,而不添加任何内容 Prism-MVVM-MEF规则。 有人可以用简单的步骤/示例演示如何执行此操作吗?TabControl可以像许多其他控件一样绑定到集合。下面是我在聊天信息程序中使用的tabcontrol的一个示例 <TabControl ItemsSource="{Binding Path=Rooms, Mode=OneWay}" SelectedItem="{Binding Path=SelectedRoom

我正在将Prism与MEF一起使用,我想动态地将选项卡项添加到选项卡控件中,而不添加任何内容 Prism-MVVM-MEF规则。
有人可以用简单的步骤/示例演示如何执行此操作吗?

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>

//在这里,您可以为希望选项卡的外观设置控件。
因此,在本例中,我有一个名为“Rooms”的自定义数据类型“ChatRoom”的集合,它的属性类似于RoomName。每当用户创建新房间时,它都会添加到“房间”集合中,并创建一个新的选项卡项。因此,在我的viewModel中:

private ObservableCollection<ChatRoom> _Rooms;

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

public ObservableCollection<ChatRoom> Rooms
{
   get { return this._Rooms; }
}
私人可观测采集室;
公共主窗口视图模型()
{
此._Rooms=新的ObservableCollection();
}
公共收集室
{
获取{返回此。_;}
}

首先,我不是说我的方法是所有可能方法中最好的。。。但我只想分享它,因为我觉得它很酷:)

您可以使用TabControlregion。。。因此,您可以简单地通过一些视图导航到该区域:)…发生了什么?当您导航到具有某些视图的TabControl区域时。。。该视图将作为新选项卡项添加

当然,有些事情你必须先做

  • 您需要修改TabControl样式。您只需要告诉TabControl在哪里可以找到选项卡项的标题。当然,您可以将其添加到应用程序的资源中

    所以你需要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}"/>
    ...
    
    
    ...
    
  • 现在,您可以在任何地方定义TabControl区域。注意,它应该使用我们前面定义的样式

    <TabControl Regions:RegionManager.RegionName="MyRegion" ... />
    
    
    
  • 现在你可以用你的视图导航到那个区域。。。当然,您必须将该视图的DataContext设置为具有字符串属性TabHeaderText的某个ViewModel


  • 现在它应该可以工作了:)当然,我们讨论的是导航,所以您应该为ViewModels提供
    [RegionMemberLifetime(KeepAlive=true)]
    属性:)我希望有一天它能帮助别人。

    您需要一个用于TabControl的区域适配器。我为Ribbon Control制作了这个,这样您可以从中获得灵感:

    公共类RibbonRegionaAdapter:RegionaAdapterBase
    {
    公共Ribbon区域适配器(IRegionBehaviorFactory区域BehaviorFactory)
    :base(regionBehaviorFactory)
    {
    }
    受保护的覆盖无效调整(IRegion区域、Ribbon区域目标)
    {
    region.Views.CollectionChanged+=(s,e)=>
    {
    if(e.Action==System.Collections.Specialized.NotifyCollectionChangedAction.Add)
    {
    foreach(e.NewItems中的RibbonTab项RibbonTab)
    {
    regionTarget.Tabs.Add(RibbonTab);
    }
    }
    if(e.Action==System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
    {
    foreach(e.OldItems中的RibbonTab项RibbonTab)
    {
    区域目标选项卡。移除(RibbonTab);
    }
    }
    };
    }
    受保护的覆盖IRegion CreateRegion()
    {
    返回新的AllActiveRegion();
    }
    }
    
    在XAML中:

    要添加选项卡,您需要以下内容:

    IRegion RibbonRegion=\u regionManager.Regions[RegionNames.RibbonRegion];
    RibbonRegion.Add(您的选项卡项视图);
    
    RegionNames只是我的infrastructe项目中的一个类:

    公共类区域名称
    {
    公共静态字符串RibbonRegion=“RibbonRegion”;
    }
    
    希望有帮助