如何在Prism应用程序中管理多个TabControlItems的内容?

时间:2018-03-14 01:21:16

标签: c# wpf wpf-controls prism prism-6

我在Prism 6.和MVVM设计模式的帮助下使用C#来使用新的WPF应用程序。

我的主窗口包含TopRightCenter区域。在顶部区域我有一个工具栏,当用户点击“显示消息”按钮时,我在中心区域显示一个名为“消息”的视图。我能够使用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>

1 个答案:

答案 0 :(得分:0)

还为选项卡视图模型添加一些DataTemplate到附近的资源字典

<DataTemplate DataType="{x:Type FirstViewModel}">
    <TextBlock Text="{Binding SomeContent}"/>
</DataTemplate>