2

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

这些是我在 Module 类中定义的两个方法,用于注册和使用视图:

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>());
}

和视图构造函数:

public ProjectView(ProjectsViewModel vm) {
    InitializeComponent();
    DataContext = vm;
}

我想要实现的是注入ProjectViewTabControl's 的内容区域。ViewModel显然,由于上述构造函数中的参数,目前它不起作用。如何以 PRISM 方式创建此功能?

编辑:

我发现了这个:如何使用 Prism 将视图注入 TabControl?但是,如果我和那个问题的作者做同样的事情,我会得到:

System.InvalidOperationException: ItemsControl's ItemsSource property is not empty.

4

2 回答 2

6

您的 TabControl 没有区域,因此您无法将某些内容注入您的 TabControl。否则,您只能使用简单的 MVVM 将某些内容注入您的视图。

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

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

然后你可以很容易地在你的视图中注入一些东西。

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

在此之前,您必须将视图添加到您的容器中:

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

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

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

我希望这就是你要找的答案^^

于 2015-12-03T09:25:21.020 回答
2

@ascholz 的回答帮助我实现了这一点。虽然最后一步对我不起作用:

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

我所做的是:

1 - 创建一个带有棱镜区域的选项卡控件(在我的例子中是在 MainWindows 内)。

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

2 - 创建一个包含选项卡视图的 TabItem (NewTabView) 类型的“用户控件”。请注意,我在这里绑定了 Header。这里的想法是在网格内添加一个区域(用于选项卡的内容),或者使需要在选项卡内的每个控件成为 TabItem 的子项。

<TabItem 
    x:Class="Client.WPF.Views.NewTab"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/"             
    prism:ViewModelLocator.AutoWireViewModel="True"
    Header="{Binding Title}">
    <Grid>
        <Button Content="{Binding RandomNumber}"/>
    </Grid>
</TabItem>
///The code behind should inherit from TabItem as well
public partial class NewTab : TabItem
///The viewmodel has a "Title" property
        private string _title = "New Tab";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

4 - 最后,我像这样导航到 NewTab(MainWindowViewModel 代码)

        public DelegateCommand NewTab { get; }

        public MainWindowViewModel(IRegionManager regionManager, IEventAggregator eventAggregato)
        {
            this.regionManager = regionManager;
            this.eventAggregator = eventAggregator;

            NewTab = new DelegateCommand(NewTabAction);
        }

        private void NewTabAction()
        {
            regionManager.RequestNavigate("TabRegion", "NewTab");
        }

5 - 作为额外的奖励,如果您想允许多个选项卡实例,您可以在视图模型 (NewTabViewModel) 上执行类似的操作。

///First add the IConfirmNavigationRequest interface
public class NewTabViewModel : BindableBase, IConfirmNavigationRequest
///...
///Then the implementation should look like this
        public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
        {

            continuationCallback(true);///Will allow multiple instances (tabs) of this view
        }

        public void OnNavigatedTo(NavigationContext navigationContext)
        {

        }

        public bool IsNavigationTarget(NavigationContext navigationContext)
        {

            return false;
        }

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {

        }

或者您也可以直接向该区域添加视图。尽管您需要使用 IContainerProvider 解析视图。像这样的东西:

var view = containerProvider.Resolve<NewTab>();
regionManager.Regions["TabRegion"].Add(view);
于 2020-01-26T10:11:54.230 回答