Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 06.10.2018
Сообщений: 6
WPF

Оконное приложение с учётом MVVM. Алгоритм конструирования для латунных чайников

30.01.2019, 19:52. Показов 5280. Ответов 9

Студворк — интернет-сервис помощи студентам
В продолжение своих попыток допилить утилиту, задуманную давно, но подвешенную в список "не срочно" надолго - дошёл до критической точки в понимании, что нельзя просто взять черновик программы на java и сделать из этого рабочее приложение на wpf, и всё потому, что я делаю это неправильно.
Решил попробовать вернуться в самое начало и разобраться с вещами, которые не прижились с наскока в моём представлении о том как оно должно бы быть.
Проблем с рабочей логикой нет, это вещи не слишком зависимые от языка и структуры приложения. Потому решил для себя сформировать от начала алгоритм создания приложения, правильный с точки зрения философии wpf. Основную часть бизнес-логики опускаю из примеров для наглядности, и прошу всех проходивших мимо, но задержавшихся разбирающихся в сабже, по возможности откритиковать получающийся алгоритм.

Конкретизация постановки задачи:
Оконное приложение для создания, сохранения в файл, просмотра и редактирования файлов, содержащих в XMS объект класса Profil

Ориентируемся на MVVM модель-представление-модель представления
Начинаем от модели
1. Создаём класс Profile.cs со всеми полями необходимыми для писания объекта и методами для изменения объекта всеми необходимыми образами

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
namespace Imeda.TP.ProfilDesigner
{
    public class Profil
    {
        private string name;
    private List<Curve> curves;
public Profil(string n)
        {
            name = n;
            this.curves = new List<Curve>();
}
public void AddCurve(Curve c)
        {
            this.curves.Add(c);
        }
public string getName ()
        {
            return name;
        }
 
        public void setName (string n)
        {
            this.name = n;
        }
}
}
2. Создаём класс модели public class TPPDModel.cs, в качестве поля создаем рабочий экземпляр класса Profil profil, в качестве методов всё необходимое для работы с файлом и преобразования объекта в xml и обратно.


3. Создаём MainWindow и закладываем основу макета окна
4. Работа в процессе Coming soon
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.01.2019, 19:52
Ответы с готовыми решениями:

Создать оконное приложение для численного интегрирования
Задача: разработать программу численного интегрирования, использующую любой итеративный алгоритм. Количество итераций определяется заданной...

Оконное приложение для работы с базой данных MS Access
Всех приветствую. Подскажите, на каком языке программирования(или среде разработки ПО) проще и лучше реализовать приложение для...

Cоздать оконное приложение для работы с углами на плоскости
создать оконное приложение для работы с углами на плоскости, задаваемыми величиной в 0,30,45,60 и 90 градусов. Реализовать Операции...

9
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
30.01.2019, 23:10
ImedaParishvili, а вопрос в чём?
0
1 / 1 / 0
Регистрация: 06.10.2018
Сообщений: 6
31.01.2019, 18:29  [ТС]
Дополняя пункт два началом класса, описывающего модель:

2. Создаём класс модели public class TPPDModel.cs, в качестве поля создаем рабочий экземпляр класса Profil profil, в качестве методов всё необходимое для работы с файлом и преобразования объекта в xml и обратно.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 class TppdModel
    {
        public Profil profil;
 
        void loadProfil ()
        {
            try
            {
                XmlDocument xDoc = new XmlDocument();
                 xDoc.Load ([U][COLOR="Red"]имяфайла[/COLOR][/U]);
            }
            catch(Exception e)
            {
                MessageBox.Show("File's not finded");
            }
        }
    }

Цитата Сообщение от Элд Хасп Посмотреть сообщение
а вопрос в чём?
Ну вот с этого момента и начинаются вопросы, потому что я не могу сообразить как это правильно архитектурно:

Откуда в методе модели возьмётся это самое имя файла, правильно ли я понимаю что оно - часть представления, которое mVvm, и должно быть что-то типа

C#
1
2
3
4
5
6
7
void loadProfil ([B]string FilePath[/B])
        {
            try
            {
                XmlDocument xDoc = new XmlDocument();
                 xDoc.Load ([B]FilePath[/B]);
}}
Правильно ли теперь в коде MainWindow инициализировать экземпляр класса TppdModel?

Ну и в догонку: а что в WPF вместо MessageBox?
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
31.01.2019, 20:37
Цитата Сообщение от ImedaParishvili Посмотреть сообщение
Откуда в методе модели возьмётся это самое имя файла, правильно ли я понимаю что оно - часть представления, которое mVvm, и должно быть что-то типа
Глубоко в структуре Вашего приложения не разбирался. Поэтому общие советы (по моему виденью)
Если имя файла статично и жёстко связанно с данными (настройки, БД, инет-ссылка и т.п.), то его можно прописать в Модель.
Если имя файла меняется пользователем, то оно должно задаваться из View. При этом диалоги OpenFileDialog и SaveFileDialog это тоже View. Поэтому можно через них задавать.
Цитата Сообщение от ImedaParishvili Посмотреть сообщение
Правильно ли теперь в коде MainWindow инициализировать экземпляр класса TppdModel?
Нет. View не может ничего знать о Модели. Если какие-то данные нужны - View обращается к VM, а уже VM, при необходимости, инициализирует Модель или один из классов Модели.
Цитата Сообщение от ImedaParishvili Посмотреть сообщение
Ну и в догонку: а что в WPF вместо MessageBox?
Так же MessageBox, но из пространства System.Windows
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
31.01.2019, 20:59
Цитата Сообщение от ImedaParishvili Посмотреть сообщение
как это правильно архитектурно:
Создайте в решении семь проектов по такой схеме

Типы проектов:
View - WPF приложение
Консоль - консольное приложение
View библиотека, ViewModel, VM библиотека, Model, Model библиотека - библиотека классов.

Если используете UC элементы, создайте для них восьмой проект типа Библиотека WPF элементов.
3
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
31.01.2019, 21:41
ImedaParishvili, и ещё. Посмотрел Вашу реализацию класса TppdModel. В Модели категорически не должно быть ни какого взаимодействия с пользователем!
В том числе вывода сообщений об ошибках. Представьте, что Модель работает на стороннем сервере. Что, куда, и для кого она будет выводить?
Просто генерируйте ошибку, а обрабатывайте её в VM.

Добавлено через 3 минуты
Я сам делал подобную ошибку и меня поправили в своё время. Посмотрите пост #11 в теме Пример реализации WPF+MVVM приложения в цикле Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп]
2
1 / 1 / 0
Регистрация: 06.10.2018
Сообщений: 6
01.02.2019, 10:17  [ТС]
Вечером подумаю над этим более разумно, но сходу кроме жалоб на тяжкую судьбу ещё вопрос:
Если делить всё на кучу проектов (я начинал в sln один проект в котором сложено всё) то в чём заключается логика выделения различных Model и ModelLib. И то и то - библиотеки классов, описывающие моделируемое программой сущность. Какие классы куда и зачем их несколько вообще?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
01.02.2019, 11:15
Цитата Сообщение от ImedaParishvili Посмотреть сообщение
Если делить всё на кучу проектов
Делить надо в целях обучения. Когда в решении нет ссылки из View на Model, то и не возникнет даже вопроса о том - можно ли в View инициализировать какой-то класс Модели? В реальных приложениях, такое полное разделение возникает в масштабных приложениях которые реализуются большими коллективами. Где над каждым проектом (или даже частью его) работает отдельная группа программистов.

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

Сама реализация начинается с Модели и её отладку надо делать в консольном приложении. Когда модель будет отлажена, то создать View и ViewModel DataDesigner (Модель представления времени разработки - далее VMDD).

После создания View создаёте ViewModel как наследника от VMDD и прописываете там необходимые методы для связи с Моделью.
Цитата Сообщение от ImedaParishvili Посмотреть сообщение
чём заключается логика выделения различных Model и ModelLib. И то и то - библиотеки классов, описывающие моделируемое программой сущность. Какие классы куда и зачем их несколько вообще?
Это больше связанно с удобством для компиляции. Допустим классы описывающие данные создаются в самом начале. В них прописываются все необходимые свойства и способы сериализации, парсинга. В Вашем примере это класс Profil. Потом в дальнейшем эти классы не меняются. Когда пишется модель использующая эти классы, то приходится при любом изменении эти классы перекомпилировать. Чтобы не делать этого, лучше их вынести в отдельную библиотеку. Они будут скомпилированы один раз и больше их трогать не будут. Так же возможно использование каких-то сторонних библиотек (их исходных кодов). То же зачем их держать в Модели?

Кроме компиляции, так просто удобнее. Даже в небольших решениях порой возникает очень много классов. И просто держать их в одном проекте одной кучей - неудобно, трудно находить, то что нужно. Дополнительно даже в рамках проекта ещё и папки в них создаются. А в реальных приложениях, для работы с реальными классами - количество классов очень большое. Вот сейчас пишу небольшое приложение для работы с биржей. Так классов набралось уже под сотню. Если их держать в одном проекте - то чёрт ногу сломит.

Вам же это пригодится в учёбе для получения необходимого в дальнейшем опыта.

На уровне ViewModel есть ещё и другой фактор. View ссылается на классы VM. Но VM создаётся позже View. Так на что ссылаться View? Даже, указанный выше класс VMDD где создавать? Единственное место это ViewModel библиотека. Потом уже ViewModel будет или использовать эти классы или создавать собственные как наследников от этих классов.
1
1 / 1 / 0
Регистрация: 06.10.2018
Сообщений: 6
05.02.2019, 18:39  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Типы проектов:
View - WPF приложение
Консоль - консольное приложение
Итак, как я понял ваш совет: нужно возвращаться к стратегии, с которой я, то ли прочитав книгу какую, то ли где ещё увидев, начал некоторое время назад в вижал студиё. То есть для начала собрать полностью костяк классов для бизнес логики и сделать первично работающую полноценную библиотеку классов. Я дошёл до момента когда среда сказала: "А теперь сделай консольку для отладки, иначе собирать проект я не буду" и скатился к старой привычной стратегии, которая вполне прокатывала на яве без заморочек на разграничения и каноничность кода с точки зрения ООП -- делал сразу настольное приложение со стремлением чтобы на каждом этапе оно собиралось и работало с целью отладки того что я постепенно дописываю в том, что нынче называется "библиотека Model".

Осталось понять что из себя должно представлять то консольное приложение.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
05.02.2019, 22:08
Цитата Сообщение от ImedaParishvili Посмотреть сообщение
без заморочек на разграничения и каноничность кода с точки зрения ООП
WPF так же можно сделать всё в одной куче в CB окна. Но такой опыт для обучения ничего не даст. Для обучения, нужно явное разделение по проектам. Когда научитесь, тогда уже сможете сами делать оптимальный выбор как реализовывать с разделением или нет.

Добавлено через 58 минут
Цитата Сообщение от ImedaParishvili Посмотреть сообщение
Осталось понять что из себя должно представлять то консольное приложение.
Модель - это набор кода для работы с данными. Она не должна содержать ни какого визуального интерфейса для пользователя. Просто представьте себе, что эта часть приложения работает удалённо на сервере.

Консольное приложение - это консольный проект. Что в нём может быть не понятного?

Допустим. Модель состоит у Вас из трёх свойств принимающих два операнда и код операции над ними, одного события сообщающего об изменении результата операции и метода возвращающего результат.

Консольное приложение выводит меню из трёх пунктов:
- первый операнд
- второй операнд
- оператор

При вводе любого из них, они отправляются в Модель. Но результат не считывается.

И нужно сделать "прослушку" события модели. Если результат изменился - он автоматически должен быть выведен на консоль.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.02.2019, 22:08
Помогаю со студенческими работами здесь

Разработать в Visual C++ оконное приложение Win32 для работы с процессами
Здравствуйте! Пытаюсь сделать приложение по предоставленным пунктам. Разработать в Visual C++ оконное приложение Win32, которое:...

Создать оконное приложение для поиска введенного пользователем числа в массиве
Помогите пожалуйста! Создать оконное приложение для поиска введенного пользователем числа в массиве.Если число найдено то,на экране...

Создать класс, реализующий перегрузку операторов, разработать оконное приложение для работы с методами класса
Помоготите кто может)))пожалуйста) Цель работы: Познакомиться с принципами перегрузки операторов в ЯП С#. Создать класс, реализующий...

Как правильнее описывать сервисы с учетом MVVM?
Я раньше вообще всю логику плодил внутри сервиса, но перейдя на MVVM я начал делать вот так: делаю у сервиса события соответствующие...

Приложение для вычисления стоимости покупки с учетом скидки
Разработать приложение для вычисления стоимости покупки с учетом скидки. Скидка 1% предоставляется, если сумма покупки больше 300 руб., 2%...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru