у меня проблема с 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 = ""
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));
}
РЕДАКТИРОВАТЬ2
Я понимаю контекст, но я хочу добиться:
создайте еще один класс 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));
}
Да, я мог бы добавить новую кнопку для активации нового элемента, но в своем проекте я хочу попробовать сделать TabControl, который будет загружать разные ViewModel, зависит от того, на какую кнопку в TabControl я нажму





Добавьте 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? А где и как хранить Items? Как Caliburn узнает, какие VM ему нужно загрузить?
А как насчет TabItem? Это визуальный элемент, который будет создан TabControl, когда вы вызовете ActivateItemAsync, чтобы добавить к нему новый элемент. И «виртуальная машина для загрузки» — это та, которую вы передаете методу ActivateItem.
Насколько мне известно, ваш фрагмент из MainWidnowVM означает, что у вас есть два bindings (например, для buttons, который называет LoadAddNewTask и LoadAddNewProject). Может я чего-то не понимаю, но откуда берется свойство Items и что делают эти методы (из MainWindowVM)? Если можете, не могли бы вы предоставить свой ответ с более сложным объяснением, что там происходит?
Items является свойством базового класса Conductor<T>. Caliburn.Micro построен на условностях. Если вы хотите узнать, как это работает, я предлагаю вам прочитать документы.
Хорошо, я понял, спасибо. Но, как я уже упоминал в своем вопросе, LoadAddNewPage() не единственная кнопка в моем MainWindowVM. Я хочу использовать TabControl только для определенной кнопки (показывать управление вкладками при нажатии этой кнопки). Могу ли я использовать свойство Items в (например) новом ViewModel (LoadAddNewPage() => this.ActivateItem(new TabViewModel(params))), хранить там виртуальные машины, о которых вы упомянули, и снова activate на выбранной вкладке из TabViewModel?
Я не понимаю вопроса. Мой пример добавляет две разные модели представления к одному и тому же TabControl. Очевидно, вы можете реализовать свои методы по своему усмотрению.
я поделился своим полным VM классом. может теперь будет понятно. Я не могу просто использовать Items, как вы упомянули. Я хочу иметь TabControl только одним нажатием кнопки. В этом методе я хочу вызвать следующую ViewModel, которая будет хранить ViewModels, чтобы добавить Project и Task, я думаю, теперь это будет более ясно
Запустить следующую модель представления? Извините, я не понимаю, что вы имеете в виду.
вы должны поместить TabControl в TabControl, вы имеете в виду, что первый ТБ должен быть TabControlViewModel? Извините за не конкретизированный вопрос
Извините, если TabControlViewModel должен «хранить две виртуальные машины, которые я буду использовать в своем TabControl», вы должны поместить TabControl в TabControlView.
Не могли бы вы просто добавить еще один
Button. Или как узнать, когда добавитьAddNewTaskViewModel, а когдаAddNewProjectViewModel?