我正在Prism 6.和MVVM设计模式的帮助下,使用C#编写新的WPF应用程序。
我有一个带有Top
,Right
和Center
区域的主窗口。在顶部区域,我有一个工具栏,当用户单击“显示消息”按钮时,我在中央区域显示一个称为“消息”的视图。我可以使用RegionManager.RequestNavigate
方法显示正常工作的“消息”视图。
但是,我的“消息”视图有多个选项卡。当用户单击TabControlItems时,我希望能够在tab-Content中显示不同的视图。
这是我的Message
视图的样子。这里的想法是拥有ViewModels
的集合,并根据该集合显示选项卡。
<TabControl ItemsSource="{Binding ViewModelCollection}"
Background="Transparent">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<prism:InvokeCommandAction Command="{Binding TabSelectionChangedCommand}"
CommandParameter="{Binding ViewName}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding TabTitle}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<ContentControl prism:RegionManager.RegionName="{x:Static foundation:RegionNames.TabContentRegionName}" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
然后在我的
MessageViewModel
中,我有以下代码public class MessageViewModel : BindableBase
{
public ObservableCollection<TabBasedNavigationAwareViewModel> ViewModelCollection { get; set; }
public DelegateCommand<string> ChangeTabContent { get; set; }
public MessageViewModel(IUnitOfWork unitOfWork, IPassportManager passportManager, ICoreRegionManager regionManager, IUnityContainer container)
: base(unitOfWork, passportManager, regionManager)
{
ViewModelCollection = new ObservableCollection<TabBasedNavigationAwareViewModel>();
ViewModelCollection.Add(container.Resolve<FirstViewModel>());
ViewModelCollection.Add(container.Resolve<SecondViewModel>());
ChangeTabContent = new DelegateCommand<string>(HandleChangeContent, CanChangeContent);
}
protected bool CanChangeContent(string viewName)
{
return true;
}
protected void HandleChangeContent(string viewName)
{
IRegion region = RegionManager.Regions[RegionNames.TabContentRegionName];
region.RequestNavigate(new Uri("Modules.Messages.Views." + viewName, UriKind.Relative));
}
public override void OnNavigatedTo(NavigationContext navigationContext)
{
ChangeTabContent.Execute("FirstView");
}
}
问题是应用程序启动时出现错误
区域管理器不包含TabContent区域。
我清楚地了解了错误以及发生原因。但不确定如何解决。在主区域内使用选项卡控件时,可能是Regions是错误的方法。我还尝试从
MessageViewModel
构造函数RegionManager.RegisterViewWithRegion(RegionNames.TabContentRegionName, typeof(MessageView));
调用以下代码当用户单击选项卡时,管理/显示正确视图的正确方法是什么?
请注意,我正在使用Fody.PropertyChanged包,因此它会在属性更改时自动通知。
更新
我尝试从视图中删除区域,现在我得到了选项卡,内容屏幕显示的是
FirstViewModel
全名,而不是相应的视图。这是我的没有区域的代码
public class MessageViewModel : BindableBase
{
public ObservableCollection<TabBasedNavigationAwareViewModel> ViewModelCollection { get; set; }
public MessageViewModel(IUnitOfWork unitOfWork, IPassportManager passportManager, ICoreRegionManager regionManager, IUnityContainer container)
: base(unitOfWork, passportManager, regionManager)
{
ViewModelCollection = new ObservableCollection<TabBasedNavigationAwareViewModel>();
ViewModelCollection.Add(container.Resolve<FirstViewModel>());
ViewModelCollection.Add(container.Resolve<SecondViewModel>());
}
}
这是视图
<TabControl ItemsSource="{Binding ViewModelCollection}"
Background="Transparent">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding TabTitle}" />
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
最佳答案
还要为您的标签视图模型添加一些DataTemplate
到附近的资源字典中
<DataTemplate DataType="{x:Type FirstViewModel}">
<TextBlock Text="{Binding SomeContent}"/>
</DataTemplate>