Как правильно реализовать меню боковой панели навигации в WPF с помощью MVVM (+ найти правильный способ изменения предстC#

Место общения программистов C#
Ответить
Anonymous
 Как правильно реализовать меню боковой панели навигации в WPF с помощью MVVM (+ найти правильный способ изменения предст

Сообщение Anonymous »

Я хотел бы извиниться, если кого-то может сбить с толку заголовок: проблема, которую я здесь описал, оказалась более сложной, чем я думал, и у меня возникли проблемы с изложением ее в заголовке.
По сути, у меня есть приложение с главным экраном, который состоит из основного пустого экрана, на котором пользователь может отображать другие представления, и боковой панели навигации сбоку. Однако когда я открываю другое представление, которое отображается в основной части экрана, оно также закрывает расширенную часть панели навигации. Причины, почему это происходит, вполне очевидны.
Чтобы это исправить, я решил разделить панель навигации и главный экран на два отдельных представления, чтобы было проще манипулировать иерархией представления, чтобы панель навигации всегда оставалась сверху, над всеми другими отображаемыми представлениями. К моему разочарованию, такой опции, похоже, не существует, поэтому я придумал другую идею - переключить активный вид при нажатии кнопки "открыть меню" и изменить его обратно на текущий при повторном нажатии.Вот как сейчас выглядит вид с боковой панелью навигации: РЕДАКТИРОВАТЬ: и его ViewModel:

Код: Выделить всё

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ApkaJezykowa.Main;
using System.Windows.Input;
using ApkaJezykowa.Commands;
using ApkaJezykowa.MVVM.Model;
using System.Threading;
using ApkaJezykowa.Repositories;
using System.Security.Principal;
using System.Timers;

namespace ApkaJezykowa.MVVM.ViewModel
{
public class MainViewModel : BaseViewModel
{
private BaseViewModel _selectedViewModel;
private BaseViewModel _mainView;

public BaseViewModel SelectedViewModel
{
get { return _selectedViewModel; }
set { _selectedViewModel = value;
OnPropertyChanged(nameof(SelectedViewModel));

}
}
public BaseViewModel MainView
{
get { return _mainView; }
set
{
_mainView = value;
OnPropertyChanged(nameof(MainView));

}
}
public ICommand UpdateViewCommand { get; set; }
public ICommand UpdateMainViewCommand { get; set; }
public MainViewModel()
{
UpdateViewCommand = new UpdateViewCommand(this);
UpdateMainViewCommand = new UpdateMainViewCommand(this);
}

}
}
//some unecessary code had been removed for better readability
Но потом я столкнулся с недостатками моего нынешнего дизайна. ViewModel каждого представления имеет свою собственную UpdateViewCommand, которая имеет свои собственные триггеры, которые решают, какое представление должно отображаться следующим.
Пример для панели навигации:

Код: Выделить всё

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Input;
using ApkaJezykowa.MVVM.ViewModel;

namespace ApkaJezykowa.Commands
{
internal class UpdateViewCommand : ICommand
{
private MainViewModel viewModel;

public UpdateViewCommand(MainViewModel viewModel)
{
this.viewModel = viewModel;
}

public event EventHandler CanExecuteChanged;

public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
if(parameter.ToString() == "Lessons")
{
viewModel.SelectedViewModel = new LessonsViewModel();
}
if (parameter.ToString() == "Dictionary")
{
viewModel.SelectedViewModel = new DictionaryViewModel();
}
if (parameter.ToString() == "Info")
{
viewModel.SelectedViewModel = new InfoViewModel();
}
if (parameter.ToString() == "Settings")
{
viewModel.SelectedViewModel = new SettingsViewModel();
}
if(parameter.ToString() == "Editor")
{
viewModel.SelectedViewModel = new LessonEditorViewModel();
}
}
}
}
...а у меня их около двух десятков. Изменение представлений, спроектированных таким образом, по существу не позволяет мне настроить это решение, поскольку навигационной панели необходимо знать, какая модель представления в данный момент активна.
Итак, в настоящее время я вижу два-три способа решения всей этой путаницы:
  • Либо выяснить, как манипулировать иерархией ViewModels, и сделать так, чтобы навигация всегда выбиралась с помощью какого-то параметра (я понятия не имею, как это сделать). достичь),
  • Или полностью переписать систему команд обновления представления на что-то более гибкое, что также позволило бы мне реализовать идею с динамически выбранными моделями просмотра и в целом сделать весь код приложения менее запутанным (что я также понятия не имею, как реализовать),
  • Полный редизайн всей боковой панели навигации, так как я предполагаю, что текущий дизайн тоже может быть несовершенным.
Я надеюсь, что объяснение моего проблема была достаточно ясна, чтобы ее можно было понять. Как всегда, заранее благодарю за любые попытки, успешные или нет, помочь мне решить эту проблему.

Подробнее здесь: https://stackoverflow.com/questions/791 ... m-figuring
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»