【问题标题】:How to make TabControl with Caliburn.Micro and diffrent UserControls如何使用 Caliburn.Micro 和不同的 UserControls 制作 TabControl
【发布时间】:2019-05-23 12:26:32
【问题描述】:

我的 TabControl 有问题,我什至不知道如何开始。

我有我命名为MainViewModel 的根视图。 Csharp 类看起来像这样:

public class MainWindowViewModel : Conductor<IScreen>.Collection.OneActive
{
    //i have couple of ToggleButtons to load diffrent UserControls, LoadAddNewPage 
    //is one of them
    public void LoadAddNewPage() => this.ActivateItem(new AddNewTaskViewModel(params));
}

我在MainWindowView.XAML 中有ToggleButton,正在加载LoadAddNewTaskPage

<ToggleButton x:Name="LoadAddNewPage"               
            Grid.Column="4"
            Width="50" Height="50" 
            Content="&#xf067;" 
            Foreground="White" 
            BorderThickness="0"  
            BorderBrush="{x:Null}" 
            Background="#FF085078" Margin="20,3,0,3" Grid.ColumnSpan="3">
       <!-- i deleted data triggers here -->
    </ToggleButton>

正如您在上面看到的,它使用表单加载 AddNewTaskViewModel 以将新项目添加到我的数据库/列表(或其他)。

AddNewTaskView.xaml 很简单 UserControl 带有文本框等。

我的问题是,如何准备我的LoadAddNewPage 按钮以加载带有两个UserControlerTabControl?现在,我正在加载new AddNewTaskViewModel()(它是UserControl,它可以按我的意愿正确加载)。如何使用Caliburn.Micro 制作TabControl 来存储AddNewTaskViewModelAddNewProjectViewModel?如何在两个不同的UserControl 之间切换TabControl?我有一个问题要开始,因为我不知道如何从这个问题开始。感谢您的任何建议

编辑

在这里我将展示我的完整视图模型

 public class MainWindowViewModel : Conductor<IScreen>.Collection.OneActive
{
    protected override void OnViewLoaded(object view) => Show.LoginBox(this.loggedUser);

    public void LoadUserInfoPage() => this.ActivateItem(new UserInfoViewModel(this.loggedUser));

    public void LoadTaskManagerPage() => this.ActivateItem(new TaskManagerViewModel(this.loggedUser, this.repository));

    public void LoadNotificationsPage() => this.ActivateItem(new NotificationsViewModel(this.repository));

    //here, i want to trigger TabControl with two VMs to choose
    public void LoadAddNewTaskPage() => this.ActivateItem(new AddNewTaskViewModel(this.loggedUser, this.repository));
}

EDIT2

我了解上下文,但我想实现:

创建另一个Vm 类,它将存储我想在我的TabControl 中使用的User Controls

public class TabControlViewModel 
{
    //how to store two VMs that i will use to my TabControl here?
}

MainViewModel:

public class MainWindowViewModel : Conductor<IScreen>.Collection.OneActive
{
    //activate TabControlViewModel that will store AddTaskVM and AddProjectVM
    //this vm will display on my `TabControl` in xaml in `MainWindowView.xaml`
    public void LoadAddNewPage() => this.ActivateItem(new TabControlViewModel(params));
}

【问题讨论】:

  • 你不能再添加一个Button。或者您如何知道何时添加 AddNewTaskViewModelAddNewProjectViewModel
  • 是的,我可以添加新按钮来激活新项目,但在我的项目中,我想尝试做TabControl,这将加载不同的ViewModel,取决于TabControl 中的哪个按钮我会点击

标签: c# wpf xaml caliburn.micro


【解决方案1】:

在视图中添加一个名为“Items”的TabControl

<TabControl x:Name="Items" />

...还有另一个Button 和将另一种类型的Screen 添加到Items 集合的方法:

public class MainWindowViewModel  : Conductor<IScreen>.Collection.OneActive
{
    public void LoadAddNewTask() => this.ActivateItemAsync(new AddNewTaskViewModel());
    public void LoadAddNewProject() => this.ActivateItemAsync(new AddNewProjectViewModel());
}

【讨论】:

  • TabItem 怎么样?当您调用 ActivateItemAsync 向其中添加新项目时,TabControl 将创建一个视觉对象。而“要加载的虚拟机”是您传递给 ActivateItem 方法的那个。
  • ItemsConductor&lt;T&gt; 基类的属性。 Caliburn.Micro 是关于约定的。如果你想知道它是如何工作的,我建议你阅读docs
  • 我不明白这个问题。我的示例将两个不同的视图模型添加到同一个 TabControl。您显然可以根据需要实现您的方法。
  • 触发下一个视图模型?抱歉,我不明白你的意思。
  • 抱歉,如果 TabControlViewModel 应该“存储两个我将使用到我的 TabControl 的 VM”,您应该将 TabControl 放在 TabControlView 中。
猜你喜欢
  • 2014-01-19
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2012-04-17
  • 2021-09-23
相关资源
最近更新 更多