这就是我定义TabControl
:
<TabControl ItemsSource="{Binding OpenedProjects, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedProject, Mode=OneWay}">
<!-- headers -->
<!-- header definition is unimportant for this question -->
<!-- content -->
<TabControl.ContentTemplate>
<DataTemplate>
<local:ProjectView />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
这些是我在Module类中定义的两种方法,用于注册和使用视图:
protected override void _initializeViews() {
_container.RegisterType<MainMenuView>();
_container.RegisterType<ProjectsView>();
_container.RegisterType<ProjectView>();
_container.RegisterType<ContentView>();
}
protected override void _initializeRegions() {
IRegion menuRegion = _regionManager.Regions[RegionNames.MainMenuRegion];
IRegion projectsRegion = _regionManager.Regions[RegionNames.ProjectsRegion];
IRegion contentRegion = _regionManager.Regions[RegionNames.ContentRegion];
menuRegion.Add(_container.Resolve<MainMenuView>());
projectsRegion.Add(_container.Resolve<ProjectsView>());
contentRegion.Add(_container.Resolve<ContentView>());
}
View构造函数:
public ProjectView(ProjectsViewModel vm) {
InitializeComponent();
DataContext = vm;
}
我想要实现的是将ProjectView
注入TabControl
的内容区域。显然,由于上面构造函数中的ViewModel
参数,它目前无效。我怎样才能创建这个功能,PRISM方式?
编辑:
我发现了这个:How to inject views into TabControl using Prism?但是如果我和那个问题的作者做同样的事情,我会得到:
System.InvalidOperationException: ItemsControl's ItemsSource property is not empty.
答案 0 :(得分:1)
您的TabControl没有区域,因此您无法在TabControl中注入某些内容。否则,您只使用简单的MVVM在视图中注入一些内容。
使用Prism在TabControl中注入一些东西。你只需要这一行:
<TabControl prism:RegionManager.RegionName="TabRegion"/>
然后你可以在视图中注入一些非常简单的东西。
_regionManager.RequestNavigate("TabRegion", new Uri("ProjectView", UriKind.Relative));
在此之前,您必须使用以下内容将视图添加到您的收件人:
UnityContainer.RegisterType<object, ProjectView>("ProjectView");
要添加Headertext,您可以轻松更改TabItem的样式,并将Header从ProjectView绑定到ViewModel:
<UserControl.Resources>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding DataContext.Name}" />
</Style>
</UserControl.Resources>
我希望那是你寻找的答案^^
答案 1 :(得分:1)
@ascholz的回答帮助我实现了这一点。尽管最后一步对我不起作用:
<UserControl.Resources>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding DataContext.Name}" />
</Style>
</UserControl.Resources>
我所做的是:
1-创建一个带有棱镜区域的Tab控件(在我的情况下位于MainWindows内部)。
<TabControl prism:RegionManager.RegionName="TabRegion"/>
2-创建一个类型为TabItem(NewTabView)的“用户控件”,其中包含选项卡视图。请注意,我在这里绑定标题。这里的想法是在网格内部(用于选项卡的内容)以及在网格中添加一个区域,或者使需要在选项卡内部的每个控件成为TabItem的子项。
<TabItem
x:Class="Client.WPF.Views.NewTab"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Header="{Binding Title}">
<Grid>
<Button Content="{Binding RandomNumber}"/>
</Grid>
</TabItem>
///The code behind should inherit from TabItem as well
public partial class NewTab : TabItem
///The viewmodel has a "Title" property
private string _title = "New Tab";
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
4-最后,我这样导航到NewTab(MainWindowViewModel代码)
public DelegateCommand NewTab { get; }
public MainWindowViewModel(IRegionManager regionManager, IEventAggregator eventAggregato)
{
this.regionManager = regionManager;
this.eventAggregator = eventAggregator;
NewTab = new DelegateCommand(NewTabAction);
}
private void NewTabAction()
{
regionManager.RequestNavigate("TabRegion", "NewTab");
}
5-作为一项额外的奖励,如果您希望允许选项卡的多个实例,则可以在视图模型(NewTabViewModel)上执行类似的操作。
///First add the IConfirmNavigationRequest interface
public class NewTabViewModel : BindableBase, IConfirmNavigationRequest
///...
///Then the implementation should look like this
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);///Will allow multiple instances (tabs) of this view
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return false;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
或者您也可以将视图直接添加到该区域。尽管您需要使用IContainerProvider解析视图。像这样:
var view = containerProvider.Resolve<NewTab>();
regionManager.Regions["TabRegion"].Add(view);