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

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

Сообщение Anonymous »

Я хотел бы извиниться, если кого-то может сбить с толку заголовок: проблема, которую я здесь описал, оказалась более сложной, чем я думал, и у меня возникли проблемы с изложением ее в заголовке.
По сути, у меня есть приложение с главным экраном, который состоит из основного пустого экрана, на котором пользователь может отображать другие представления, и боковой панели навигации сбоку. Однако когда я открываю другое представление, которое отображается в основной части экрана, оно также закрывает расширенную часть панели навигации. Причины этого вполне очевидны.
Чтобы это исправить, я решил разделить панель навигации и главный экран на два отдельных представления, чтобы было проще манипулировать иерархией представления, чтобы панель навигации всегда оставалась сверху, над всеми другими отображаемыми представлениями. К моему разочарованию, такой опции, похоже, не существует, поэтому я придумал другую идею - переключить активный вид при нажатии кнопки "открыть меню" и изменить его обратно на текущий при повторном нажатии.Вот как сейчас выглядит вид с боковой панелью навигации: Но потом я столкнулся с недостатками моего нынешнего дизайна. 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#»