使用 TabControl (MVVM) 显示不同的 ViewModel

Show different ViewModels with TabControl (MVVM)

我写了一个具有不同 ViewModel 的应用程序,一个用于用户、组和机器。每个 ViewModel 都有自己的视图。我正在使用 Caliburn.Micro。 现在我用这样的按钮在视图之间切换:

XAML:

     <StackPanel Orientation="Horizontal">
                <Button VerticalAlignment="Top" Margin="5" Height="30" x:Name="ShowUsers" Content="Users"/>
                <Button VerticalAlignment="Top" Margin="5" Height="30" x:Name ="ShowGroups" Content="Groups"/>
                <Button VerticalAlignment="Top" Margin="5" Height="30" x:Name ="ShowMachines" Content="Machines"/>
            </StackPanel>
<ContentControl Grid.Row="1" x:Name="ActiveItem"/>

C#:

public AdminViewModel(GroupManagementViewModel groupManagementViewMode, MachineManagementViewModel machineManagementViewModel, UserManagementViewModel userManagementViewModel)
        {
            this._groupManagementViewModel = groupManagementViewMode;
            this._machineManagementViewModel = machineManagementViewModel;
            this._userManagementViewModel = userManagementViewModel;
        }

        protected override void OnActivate()
        {
            base.OnActivate();
            ShowUsers();
        }

        public void ShowUsers()
        {
            ActivateItem(_userManagementViewModel);
        }

        public void ShowGroups()
        {
            ActivateItem(_groupManagementViewModel);
        }

        public void ShowMachines()
        {
            ActivateItem(_machineManagementViewModel);

我想使用 TabControl 更改这些按钮,我尝试了几种方法,现在我的代码如下所示:

XAML(使用 Tabcontrol):

<TabControl>
            <TabItem Header="User" x:Name="ShowUsers">
               
            </TabItem>
            
            <TabItem Header="Groups" x:Name="ShowGroups">
                
            </TabItem>
            <TabItem Header="Machines" x:Name="ShowMachines">
              
            </TabItem>
           
        </TabControl>
        <ContentControl Grid.Row="1" x:Name="ActiveItem"/>

所以我在我的 ViewModel 中为 TabItems 提供了 x:Name 命令,但它只为每个 TAB 显示相同的视图模型

如果有任何提示,我将不胜感激。

此致

TabControl 元素有一个 ItemSource 属性 可用于完成这项工作。例如:

您可以将 ItemSource 绑定到一个类型的可观察集合,该类型是您要在选项卡控件中使用的所有三个视图模型的基础 class:

public ObservableCollection<BaseViewModel> TabControlViewModels { get; }

ItemSource 将绑定到此。

查看 TabControl (ItemsControl) 可能对以下内容有所帮助:SelectedIndex、ItemsPanel、ItemTemplate 和 ItemContainerStyle,使其看起来像您想要的样子。

另请参阅此处了解更多详情:How do I bind a TabControl to a collection of ViewModels?

使用Caliburn.Micro,视图中的XAML标记应该像这样简单:

<TabControl x:Name="Items" />

然后视图模型应该从 Conductor<T>.Collection.OneActive 继承并将选项卡视图模型添加到 Items 属性:

public class AdminViewModel : Conductor<object>.Collection.OneActive
{
    public AdminViewModel(GroupManagementViewModel groupManagementViewMode, 
        MachineManagementViewModel machineManagementViewModel, 
        UserManagementViewModel userManagementViewModel)
    {
        Items.Add(groupManagementViewMode);
        Items.Add(machineManagementViewModel);
        Items.Add(userManagementViewModel);
    }
}

选项卡视图模型应继承自 Screen。然后你可以设置其中的DisplayName属性来修改标签页眉。