我在Prism 6.和MVVM设计模式的帮助下使用C#来使用新的WPF应用程序。
我的主窗口包含Top
,Right
和Center
区域。在顶部区域我有一个工具栏,当用户点击“显示消息”按钮时,我在中心区域显示一个名为“消息”的视图。我能够使用RegionManager.RequestNavigate
方法来显示“消息”视图,该视图工作正常。
但是,我的“消息”视图有多个标签。当用户点击TabControlItems时,我希望能够在标签内容中显示不同的视图。
以下是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区域。
我清楚地了解错误及其发生的原因。但不确定如何解决它。可能是在主区域内使用制表符控件时,区域是错误的方法。我还尝试从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>
答案 0 :(得分:0)
还为选项卡视图模型添加一些DataTemplate
到附近的资源字典
<DataTemplate DataType="{x:Type FirstViewModel}">
<TextBlock Text="{Binding SomeContent}"/>
</DataTemplate>