使用 TabControl (MVVM)

问题描述

我编写了一个具有不同 viewmodel 的应用程序,一个用于用户、组和机器。每个 viewmodel 都有自己的 View。我正在使用 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 绑定到一个类型的可观察集合,该集合是您要在选项卡控件中使用的所有三个视图模型的基类:

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 属性来修改标签页眉。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...