使用 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
属性来修改标签页眉。
我写了一个具有不同 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
属性来修改标签页眉。