Всем доброго времени суток. Моя проблема заключается в следующем, как реализовать в WPF переключение между страницами используя MVVM. Переключение должно осуществлять по нажатию кнопки, расположенных слева на изображении.Страниц будет всего лишь шесть, как и кнопок.
Ответ
Я уже указывал в комментариях на пример своего ответа здесь. Может такой вариант и представляется кому-то рабоче-крестьянским способом, в особенности для любителей девственно чистого кодбихайнд, но я считаю его вполне годным и, самое главное, простым и быстрым в реализации. Ладно, это лирика.
Вот вам другой вариант,
с рефлексией, все дела, как у четких пацанов...:) Это не мой мопед, я чисто его сп... подсмотрел в проекте NAudio.
Подход довольно интересный, кстати.
Создаем вот такой интерфейс
public interface IModule
{
///
Далее для каждой пары View & ViewModel создается еще один класс, который реализует этот интерфейс таким образом:
class SeparateDemo : IModule
{
//наша неразлучная парочка
private SeparateDemoView view;
private SeparateDemoViewModel viewModel;
public string Name => "Вьюшка SeparateDemo";
public UserControl UserInterface
{
get { if (view == null) CreateView(); return view; }
}
private void CreateView()
{
//загружаем вьюшку
view = new SeparateDemoView();
//её вьюмодель
viewModel = new SeparateDemoViewModel();
//связываем их между собой
view.DataContext = viewModel;
}
public void Deactivate()
{
viewModel.Dispose();
view = null;
}
}
т.е. это такой загрузчик для пары View & ViewModel.
Далее это у нас MainWindow.xaml
Это её вьюмодель, которая подгружает и отображает нужную вьюшку
class MainWindowViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
//ctor
public MainWindowViewModel(IEnumerable
//Properties
///
///
///
А вот теперь самая мякотка - тут без рефлексии не обойтись
static class ReflectionHelper
{
public static IEnumerable
Подправляем App.xaml такой строчкой - Startup="Application_Startup">
И тогда App.xaml.cs такой
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
var mainWindow = new MainWindow();
var modules = ReflectionHelper.CreateAllInstancesOf
var vm = new MainWindowViewModel(modules);
mainWindow.DataContext = vm;
mainWindow.Closing += (s, args) => vm.SelectedModule.Deactivate();
mainWindow.Show();
}
}
Вот и все. Как вариант можно сделать промежуточный класс abstract class ModuleBase : IModule и тогда загрузчик пары можно сделать таким
class FirstDemo : ModuleBase
{
public override string Name
{
get { return "Вьюшка FirstDemo"; }
}
protected override UserControl CreateViewAndViewModel()
{
return new FirstDemoView() { DataContext = new FirstDemoViewModel() };
}
}
Весь проект целиком можно скачать здесь
Комментариев нет:
Отправить комментарий