Wpf 如何以编程方式将选项卡项添加到prism中的选项卡控件
我正在将Prism与MEF一起使用,我想动态地将选项卡项添加到选项卡控件中,而不添加任何内容 Prism-MVVM-MEF规则。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
有人可以用简单的步骤/示例演示如何执行此操作吗?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区域时。。。该视图将作为新选项卡项添加
当然,有些事情你必须先做
<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 Regions:RegionManager.RegionName="MyRegion" ... />
现在它应该可以工作了:)当然,我们讨论的是导航,所以您应该为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”;
}
希望有帮助