Member 11859517 Ответов: 1

Перейдите с помощью пользовательских элементов управления с помощью MVVM свет (в WPF)


Итак, вот мой вопрос: Каков наилучший способ достижения навигации между UserControl, содержащимся в MainWindows, предполагая, что:

У меня есть ViewModel для каждого UserControl и один для основных окон.
Кнопки для переключения между элементы управления UserControl содержатся в UserControl себя
- У меня есть ViewModelLocator
- Мне нужно иногда разрушить/создать пользовательский элемент управления-это модель представления
- Я хочу уважать модель MVVM.
- Я хочу, чтобы все было просто
пример : наличие файла mainwindow.xaml, содержащего элемент управления содержимым и 3 пользовательских элементов управления, на мой взгляд, допустим, первый взгляд, SecondView, ThirdView. Firstview содержит кнопку и по щелчку этой кнопки перейдите к SecondView и SecontView содержит кнопку и по щелчку перейдите к ThirdView, а третий вид содержит кнопку, которая будет перемещаться к FirstView.

Что я уже пробовал:

Я пробовал с datatemplate, но если кнопка на главном окне, но в моем случае кнопка находится на самом usercontrol.

1 Ответов

Рейтинг:
2

Ashutosh Gpt

сначала вы можете попробовать сделать все три пользовательских элемента управления отдельными представлениями и viewmodel
MainView.xmal -> MainViewModel
FirstView.xmal -> FirstViewModel
SecondView.xmal -> SecondViewModel
ThridView.xmal -> thirdViewModel

MainviewModel есть

RelayCommand MainButtonClickEventHandler
для кнопки Mainview и привязки с помощью
Command="{Binding Path=MainButtonClickEventHandler}"


При выполнении этой команды
var FirstV = new FirstView() { datacontext = FirstViewModel };
Первый взгляд.Показать();
// или закройте MainView (), если это необходимо.

повторите ту же концепцию для второго и третьего вида и модели вида.


Member 11859517

Спасибо Ашутош,

У меня есть 3 пользовательских элемента управления с ViewModel,
но var FirstV = new FirstView(){DataContext = FirstViewModel}
выдает ошибку, что "FirstViewModel" - это тип, который не является допустимым для данного контекста,

но я думаю, что это решение для кнопки if на mainView, но моя кнопка на usercontrol, на этой кнопке нажмите кнопку хотите открыть на другом пользовательском элементе управления на,
я новичок в mvvm, Pls, если вы предоставляете кодовый блок. это wolud мне помочь

[no name]

вы очень близки к своему решению, и я могу дать вам несколько советов, подсказок и кода для начала.позже вы можете улучшить его, используя свои мысли .
я создал тип окна mainwindow и тип элемента управления firstuser пользовательского элемента управления.
одна модель представления для FirstVM.

публичный частичный класс MainWindow : Window
{
публичное главное окно()
{
метод InitializeComponent();
}

частная button_click появилась недействительным(объект отправителя, RoutedEventArgs е)
{
var firstv = new firstview() { DataContext = new FirstVM() };

var window = CreateWindow();
окно.Содержание = firstv;
этот.Скрыть();

окно.Владелец.OwnedWindows[0].ShowDialog(); // попросите владельца этого окна показать диалоговое окно.
}

частное окно CreateWindow()
{
возврат нового окна
{
Стиль_окна = Стильокна.Никто,
SizeToContent = SizeToContent.WidthAndHeight,
AllowsTransparency = true,
ShowInTaskbar = true,
Владелец = это,
WindowStartupLocation = WindowStartupLocation.CenterScreen
};
}
}

публичный класс FirstVM : INotifyPropertyChanged
{
публичное мероприятие PropertyChangedEventHandler PropertyChanged;
}

[no name]

вы можете улучшить свою оконную часть в этом коде, например стиль и расположение и т. д.

Member 11859517

спасибо, я использую MVVM light. Вот почему я хочу использовать код в коде за главным окном,
что мне действительно нужно сделать, так это,
Я мое главное окно у меня есть
&ЛТ;маржа класса ContentControl="10" сетки.строка="1" наименование="viewLoader" содержание="{привязки CurrentViewModel}"&ГТ;

В моем mainViewModel у меня есть свойство типа ViewModelBase
private ViewModelBase currentViewModel;
public ViewModelBase CurrentViewModel
{
get { return currentViewModel; }
набор
{
currentViewModel = значение;
RaisePropertyChanged(() => CurrentViewModel);
}
}
как установить это свойство из моей FirstviewModel, я имею в виду, что хочу назначить FirstView элементу управления контентом
использование mvvm

[no name]

1. Сначала сделайте IviewModelbase, чтобы реализовать все три viewmodels с тем же самым.
2.
публичный интерфейс IViewModelBase { }
публичный класс MainViewModel : INotifyPropertyChanged
{
частная IViewModelBase currentViewModel;

общественные IViewModelBase CurrentViewModel
{
get { return currentViewModel; }
набор
{
currentViewModel = значение;
RaisePropertyChanged(nameof(CurrentViewModel));
}
}

публичное мероприятие PropertyChangedEventHandler PropertyChanged;

защищенных виртуальных недействительными RaisePropertyChanged([callermembername не используется] строку имя_свойства = нуль)
{
Собственность поменялась?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

внутренняя пустота OpenFirstControl()
{
CurrentViewModel = новый FirstVM();
RaisePropertyChanged(nameof(CurrentViewModel));
}
}

FirstVM.в CS
публичный класс FirstVM : INotifyPropertyChanged, IViewModelBase
{
публичное мероприятие PropertyChangedEventHandler PropertyChanged;
}

Представлении MainView.в CS
частная button_click появилась недействительным(объект отправителя, RoutedEventArgs е)
{
var mainViewModel = это.DataContext как MainViewModel;
mainViewModel.OpenFirstControl();
var firstv = new firstview() { DataContext = mainViewModel.CurrentViewModel };

var window = CreateWindow(это);
окно.Содержание = firstv;
этот.Скрыть();

окно.Владелец.OwnedWindows[0].Метод showdialog();
}