c# - 使用 Prism 库将 View 注入(inject) TabControl

这就是我定义 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>

这是我在模块类中定义的两个方法,用于注册和使用 View :

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 注入(inject)到 TabControl 的内容区域。显然,由于上述构造函数中的 ViewModel 参数,目前它不起作用。如何以 PRISM 方式创建此功能?

编辑:

我找到了这个:How to inject views into TabControl using Prism?但是,如果我和那个问题的作者一样,我会得到:

System.InvalidOperationException:ItemsControl 的 ItemsSource 属性不为空。

最佳答案

您的 TabControl 没有区域,因此您无法向 TabControl 中注入(inject)内容。否则,您只能使用简单的 MVVM 将一些东西注入(inject)您的 View 。

使用 Prism 在您的 TabControl 中注入(inject)一些东西。你只需要这一行:

<TabControl prism:RegionManager.RegionName="TabRegion"/>

然后您可以将一些非常简单的东西注入(inject)到您的 View 中。

_regionManager.RequestNavigate("TabRegion", new Uri("ProjectView", UriKind.Relative));

在此之前,您必须使用以下方法将 View 添加到您的容器中:

UnityContainer.RegisterType<object, ProjectView>("ProjectView");

要添加 Headertext,您可以轻松更改 TabItem 的样式并将 Header 绑定(bind)到 ProjectView 的 ViewModel:

<UserControl.Resources>
    <Style TargetType="TabItem">
        <Setter Property="Header" Value="{Binding DataContext.Name}" />
    </Style>
</UserControl.Resources>

希望这就是您要找的答案^^

https://stackoverflow.com/questions/32284075/

相关文章:

r - 在 R 中将字符串拆分为固定长度元素的最快方法

c# - 使用 UpdateAsync 方法 ASP.NET Entity Framework

git - 在 git 中恢复大多数前 n 个提交

date - 同步系统时间和日期的批处理文件

html - 使用 ng-classes 样式输入占位符颜色样式

c# - 如何使用 LinQ 按值分组获取字典中的键列表

shopify - Liquid 中的逗号分隔列表

selenium - 如何 'click' 单选按钮 -> 需要 xPath

docker - 学习 docker 的先决条件

css - 选择器属性中的手写笔迭代