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

我有一个带有TopRightCenter区域的主窗口。在顶部区域,我有一个工具栏,当用户单击“显示消息”按钮时,我在中央区域显示一个称为“消息”的视图。我可以使用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>

10-05 20:46
查看更多