Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
880 / 559 / 291
Регистрация: 21.11.2012
Сообщений: 1,554

Пример вызова нового окна или сообщения MVVM

21.07.2016, 10:22. Показов 7231. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
привет форумчане, знаю, что тема заезжена и все такое, но тем не менее..

у меня есть маленький пример проекта, в котором я разбираюсь с чистым паттерном mvvm. Там все просто, есть главное окно с меню слева и с тулбаром. по клику на меню, в главное окно подгружаются различные юзер контролы (в данном примере 2 wpf контрола и 1 winForms, который должен хоститься в главное окно. Тут оговорюсь, не знал где делать его вызов, не нарушив логику MVVM. оставил в модели окна, правда обычно вызывал в коде самого окна, но не в этом суть).

в общем собственно к вопросу... в этом примерчике есть 2 меню, при клике на которые:

1. клик по меню Окно - создается новое окно и отображается на экране (Window w = new Window(); w.Show()
2. клик по меню Сообщение - отображение какого-нибудь сообщения на экране, скажем MessageBox.Show("Данная функция недоступна");

кому не трудно, изменить мой пример так, чтобы это работало. Перечитал кучу информации на различных форумах, да и здесь тему создавал. В основном советуют использовать стороннюю библиотеку PRISM, но
1. не понимаю как ее использовать, ибо так и не встретил простого примера ее работы
2. сторонние библиотеки у нас не приветствуются, поэтому должно работать стандартными средствами.

проект прилагается. Заранее благодарен
Вложения
Тип файла: zip MVVM.zip (259.2 Кб, 17 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.07.2016, 10:22
Ответы с готовыми решениями:

Открытие нового окна mvvm
Новое окно вызываю таким образом Link Link = new Link(); Link.Show(); Как в таком случае...

Вызов окна из другого окна. Паттерн MVVM
тут ламмерский вопрос) есть 2 окна со своими вьюмодельс. в первом окне есть кнопка, по которой должно открываться второе окно. как...

функция для вызова нового окна
хочу реализовать следующую фишку: чтобы при запуске макроса в Excel выводилось небольшое окно с ниспадающим списком, где можно было...

17
 Аватар для Cuguyc
44 / 44 / 16
Регистрация: 02.06.2016
Сообщений: 95
25.07.2016, 10:27
Вот переделал немного.

По существу, вот весь код, что я добавил:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
            else if (MenuOknoActiv)
            {
                CurrentView = null;
                Window win = new Window();
                MyUserControl muc = new MyUserControl();
                win.Content = muc;
                win.ShowDialog();
            }
            else if (MenuSoobshenieActiv)
            {
                CurrentView = null;
                MessageBox.Show("HelloWorld");
            }
Ну и ещё UserControl.
Вложения
Тип файла: rar MVVM edit.rar (258.4 Кб, 22 просмотров)
0
 Аватар для Cuguyc
44 / 44 / 16
Регистрация: 02.06.2016
Сообщений: 95
25.07.2016, 10:29
По поводу Prism смотрите сами, если планируется большой проект, тогда может есть смысл его использовать, а если проект не большой, то думаю игра не стоит свеч =) Но как минимум для саморазвития освоить призм думаю лишним не будет.
0
880 / 559 / 291
Регистрация: 21.11.2012
Сообщений: 1,554
25.07.2016, 13:46  [ТС]
Cuguyc,

то что вы написали нарушает логику mvvm или я что-то неправильно понимаю??? ведь viewmodel не должна "видеть" свой view.
) видимо я неправильно выразился при написании темы.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
25.07.2016, 20:40
Цитата Сообщение от hamin Посмотреть сообщение
viewmodel не должна "видеть" свой view
Может так: Как открывать следующую форму правильно не нарушая принцыпы WPF(MVVM)?
WinForm убрать и запихнуть всё в ElementHost контрол.
0
 Аватар для Cuguyc
44 / 44 / 16
Регистрация: 02.06.2016
Сообщений: 95
26.07.2016, 08:39
hamin, А в каком месте Viewmodel видет свой View?
Там, где мы создаем окно, мы указываем во viewmodel создание нового окна, но у нового окна будет уже свой viewmodel, который мы подцепим при инициализации элемента usercontrol, не вижу тут нарушений MVVM, так как ViewModel создает совершенно новое окно со своим блекджеком и view'шками.

Добавлено через 5 минут
C#
1
2
3
4
5
6
7
8
public partial class MyUserControl : UserControl
    {
        public MyUserControl()
        {
            InitializeComponent();   
            this.DataContext = new MyUserControlViewModel();
        }
    }
Где MyUserControlViewModel это ViewModel для view MyUserControl.
Вроде всё сходится =)
ViewModelMainWindow ничего не знает про MainWindow
MyUserControlViewModel ничего не знает про MyUserControl
0
880 / 559 / 291
Регистрация: 21.11.2012
Сообщений: 1,554
26.07.2016, 10:14  [ТС]
Cuguyc,

т.е. то, что вьюмодель главного окна знает о вью какого-то дочернего окна - это нормально? тогда не вижу никакого смысла в mvvm

Добавлено через 5 минут
skilllab,

пример, который вы скинули оперирует с юзерконтролами и подгружает их в главное окно, в зависимости от выбранного меню слева. Это то я как раз и понимаю, что и показано у меня в проекте) мне нужно именно открытие дочернего окна и вывод сообщения на экран в рамках mvvm

Добавлено через 7 минут
вот примерно такая же проблемка и ответ снизу, тогда вопрос, в чем плюсы такого подхода?
0
 Аватар для Cuguyc
44 / 44 / 16
Регистрация: 02.06.2016
Сообщений: 95
26.07.2016, 11:36
hamin, Ну если уж строго следовать модели MVVM, то пишем класс Бизнес логики и в нём уже реализуем вызов окна, а в Классе ViewModel просто создаем объект класса Бизнес логики и у него вызываем метод создания окна, профит=)

Добавлено через 4 минуты
По хорошему вообще вся логика приложения должна быть вынесена в отдельный класс, а ViewModel будет прослойкой между Представлением и классом логики, это как я это понимаю.

Добавлено через 37 секунд
Может я в чём-то ошибаюсь, если кто поправит, буду признателен =)
1
880 / 559 / 291
Регистрация: 21.11.2012
Сообщений: 1,554
26.07.2016, 13:11  [ТС]
Cuguyc,

вот это уже ближе к истине. Что тогда представляет из себя класс бизнес логики??
т.е. это по сути то, что я нашел на просторах интернета?

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class ViewModel
{
    private readonly IWindowFactory m_windowFactory;
    private ICommand m_openNewWindow;
 
    public ViewModel(IWindowFactory windowFactory)
    {
        m_windowFactory = windowFactory;
 
        /**
         * Would need to assign value to m_openNewWindow here, and associate the DoOpenWindow method
         * to the execution of the command.
         * */
        m_openNewWindow = null;  
    }
 
    public void DoOpenNewWindow()
    {
        m_windowFactory.CreateNewWindow();
    }
 
    public ICommand OpenNewWindow { get { return m_openNewWindow; } }
}
 
public interface IWindowFactory
{
    void CreateNewWindow();
}
 
public class ProductionWindowFactory: IWindowFactory
{
 
    #region Implementation of INewWindowFactory
 
    public void CreateNewWindow()
    {
       NewWindow window = new NewWindow
           {
               DataContext = new NewWindowViewModel()
           };
       window.Show();
    }
 
    #endregion
}
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
26.07.2016, 14:25
Цитата Сообщение от hamin Посмотреть сообщение
и ответ снизу
Это программирование на основе интерфейсов. Основа Dependency Injection.
Цитата Сообщение от hamin Посмотреть сообщение
в чем плюсы такого подхода
Возможность подсовывать в метод тот же код, но результат может быть разный. Внутрях CreateNewWindow можно запихать всё что душе угодно. Хоть новое окно, хоть контрол.
1
880 / 559 / 291
Регистрация: 21.11.2012
Сообщений: 1,554
26.07.2016, 15:56  [ТС]
всем спасибо за ответы, буду разбираться!
0
 Аватар для Cuguyc
44 / 44 / 16
Регистрация: 02.06.2016
Сообщений: 95
26.07.2016, 16:53
Цитата Сообщение от hamin Посмотреть сообщение
т.е. это по сути то, что я нашел на просторах интернета?
По сути - да, вот тут мы со skillab обсуждали ещё использование Model при binding'е из View, может пригодиться.
ИМХО для построения удобно тестируемого приложения нужно разносить на слои все части приложения, сейчас я пробую в своём проекте View и ViewModel запихнуть в Presentation Layer, логику приложения в Buisness Layer, ну и работу с данными в т. ч. Model в Data Access Layer. Главное во всём этом не запутаться =)
0
880 / 559 / 291
Регистрация: 21.11.2012
Сообщений: 1,554
27.07.2016, 13:04  [ТС]
раз уж такое дело пошло, давайте добивать.

скажем у меня есть главное окошко с 3 меню. по клику на каждое из таких меню открываются разные окна, скажем:
myWindow1, myWindow2, myWindow3.

тогда мне нужно создавать интерфейс как в примере выше с 3 методами?

ну или делая грабли, в метод добавить переменную, с помощью которой можно было бы определить какое окно вызывать, скажем вью модель и по ее типу определять какое окно подгружать
0
 Аватар для Cuguyc
44 / 44 / 16
Регистрация: 02.06.2016
Сообщений: 95
27.07.2016, 16:29
Я думаю, что всё зависит от задачи. Если Вам нужно будет делать много окон(в чем я сомневаюсь, потому что это не совсем удобно), то лучше заморочиться и сделать интерфейсы, а если нет, то я бы обошелся малой кровью ибо зачем усложнять и нагружать проект классами и интерфейсами, где от них реальной пользы толком не будет, только больше кода и куча классов. Ну это моё лично мнение))
1
880 / 559 / 291
Регистрация: 21.11.2012
Сообщений: 1,554
28.07.2016, 09:54  [ТС]
ну и последний вопрос. как я понимаю, с сообщениями тоже самое:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public interface IDialogService 
{
     void ShowMessage (string messege, string title = "");
}
public class DialogService : IDialogService 
{
     public void ShowMessage (string message, string title = "")
     {
            MessageBox.Show(message, title);
     }
}
 
public class MyViewModel : ModelBase
{
    private IDialogService _dialogs;
   
    public MyViewModel (IDialogService dg)
    {
         _dialogs = dg;
    }
    private void MyTestMethod ()
    {
         //...
         _dialogs.ShowMessage("Hallo, World");
    }
}
получается в конструктор модели я передаю объект класса DialogService. Этот объект, где он создается?? как я понимаю он должен создаваться 1 раз глобально и передаваться во все модели, где его будут использовать, иначе можно было бы создавать объект непосредственно внутри модели, я прав?
0
 Аватар для Cuguyc
44 / 44 / 16
Регистрация: 02.06.2016
Сообщений: 95
28.07.2016, 13:07
Вы в коде создаете объект интерфейса?
C#
1
private IDialogService _dialogs;
C#
1
public class MyViewModel : ModelBase //советую обозвать ModelBase  по другому, так как ViewModel, который наследуется от абстрактного класса модели, это как-то странно... или я чего-то не понимаю
Вообще по поводу сообщений я бы не заморачивался и вызывал прям где надо, так как у MessageBox мы же не задаем View и не прописываем привязку ViewModel, думаю игра не стоит свеч =)

Если уж хотите всё разносить и даже MessageBox то сделайте статический класс с нужным Вам методом, тогда и объект создавать не надо.

Надо короче всё собрать во едино. Вот как бы сделал я:
Есть мои слассы View, они цепляются к ViewModel (но используют поля Model)
Сейчас поясню, то есть во ViewModel мы просто объявляем объект модели, а привязка идет из View через точку объекта.
Далее все команды привязываем к методам ссылающимся на методы класса бизнес логики.
То есть я не пишу методов в ViewModel а комманды сразу направляю на нужные методы класса бизнесс логики
C#
1
if (_menuClick == null) _menuClick = new RelayCommand(p => myBuisLayerClassObj.SelectModul());
При таком раскладе нам не надо создавать лишних переменных и методов, а всю логику мы перенаправляем на класс бизнесс логики.
Далее в классе бизнес логики мы можем спокойно вызывать любые окна.
Далее нужно смотреть по конкретной ситуации, я думаю не стоит нагружать проект лишним кодом, будет плохо читаться.
По сути код который Вы написали выше просто обертка на MessageBox я бы на просто написал бы в классе бизнесс логики просто MessageBox.Show("HelloWorld");
1
880 / 559 / 291
Регистрация: 21.11.2012
Сообщений: 1,554
28.07.2016, 13:41  [ТС]
Cuguyc,

Цитата Сообщение от Cuguyc Посмотреть сообщение
Вы в коде создаете объект интерфейса?
конечно же нет, оЧепятка)) конечно же там и конструктор и само поле нужно изменить на DialogService. нельзя ведь создавать объект интерфейса))

в общем суть я уловил, а как будем делать - будем посмотреть. спасибо за помощь!
0
 Аватар для Cuguyc
44 / 44 / 16
Регистрация: 02.06.2016
Сообщений: 95
28.07.2016, 15:07
hamin, Рад помочь, порой обсуждая ту или иную ситуацию приходишь к новым для себя решениям
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.07.2016, 15:07
Помогаю со студенческими работами здесь

Функция для вызова нового окна с консольным приложением
Здравствуйте. Есть программа на C++ написана в консольном варианте. Мне нужно привязать это консольное окно к кнопке - то есть , я...

Выкачать файл без открытия нового окна или вкладки с выбором места сохранения
Подскажите пожалуйста, как скачать файл При клике на ссылку, открывается новая вкладка с файлом Необходимо отправлять AJAX запрос на...

Прошу пример MVVM реализации
привет во всех примерах что изучал View ViewModel Code - datacontex=new ViewModel - и не видно привязки к обьекту Code прошу...

Пример реализации WPF+MVVM приложения
Тема из цикла https://www.cyberforum.ru/wpf-silverlight/thread2384523.html Пример решения ТЗ по теме...

Пример вызова подпрограммы
Доброго времени суток, ну помогите пожалуйста с задачкой на tasm . Программа MAINPRO должна вызвать программу SUBPRO.В программе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru