Как сделать TabControl с Caliburn.Micro и различными UserControls - PullRequest
0 голосов
/ 23 мая 2019

У меня проблема с 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));
}

У меня есть ToggleButton в MainWindowView.XAML этой загрузке 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 для загрузки TabControl с двумя UserControler?Сейчас я загружаю new AddNewTaskViewModel() (это UserControl, он загружается правильно, как я хочу).Как сделать TabControl с Caliburn.Micro, который будет хранить AddNewTaskViewModel и AddNewProjectViewModel?Как сделать переключение в TabControl между двумя UserControl?У меня есть проблема, чтобы начать, потому что я не знаю, как начать с этой проблемой.Спасибо за любые советы

РЕДАКТИРОВАТЬ

Здесь я покажу мою полную ViewModel

 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 класс, который будет хранить мой User Controls, который я хочу использовать в моем TabControl:

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

1 Ответ

1 голос
/ 23 мая 2019

Добавьте TabControl с именем "Items" в представление:

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