Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/22: Рейтинг темы: голосов - 22, средняя оценка - 4.95
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397

Разница в структурах MVC и MVVM на конкретном примере

08.01.2015, 16:40. Показов 4560. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Люди в теории понимаю, как работает MVC, но не совсем понимаю разницы между MVC и MVVM. Смотрел ролики, читал ресурсы, но очень хотелось бы разобрать на конкретном примере. Вот я на WPF создаю игру Морской Бой. Поправьте, если я ошибаюсь. Для того чтобы следовать структуре MVC, я создаю три папки, главное окно идёт в View. Я создаю поле из 100 клеток, само поле - это тоже view. Но его данные, такие как количество клеток, длина, ширина, цвет - это уже данные, которые могут хранть в файле field.xml в папке Model, так? Когда я навожу мышкой на одну из клеток, то она меняет свой цвет, стало быть на событие мышки в файле этого поля который находится в папке View я вызываю метод ChangeColor, который написан уже в контроллере. То есть у меня есть gridModel, gridView и gridController. Правильно ли я понял структуру MVC? Если да, то какие изменения нужно сделать, чтобы получить структуру MVVM? Заранее спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.01.2015, 16:40
Ответы с готовыми решениями:

На конкретном примере
Добрый вечер! На конкретном примере показать как с помощью документа переносить данные из одного справочника в другой. Пусть это будет...

связь MVC и MVVM. Трудно ли освоить mvc параллельно с изучением ASP.NET
Здравствуйте, начал изучать ASP.NET для курсовой работы. Начал читать "Мак-Дональд М., Фримен А., Шпушта М. Microsoft ASP.NET 4 с примерами...

Маршрутизация на конкретном примере
ОС Win7 config Настройка протокола IP для Windows Имя компьютера . . . . . . . . . : NamePC Основной DNS-суффикс . ....

14
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
08.01.2015, 17:00
биндинги брат. сила в биндингах.
0
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
08.01.2015, 17:44  [ТС]
Не могли бы показать на конкретном небольшом примере пожалуйста?
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
08.01.2015, 18:24
Лучший ответ Сообщение было отмечено Pro100Tom как решение

Решение

Вот очень подробная статья по mvvm.
1
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
08.01.2015, 23:42  [ТС]
Спасибо большое. Реально помогло разобраться. Такой еще вопрос. Как лучше создавать Controls: через XAML или в cs файле? Мне очень нравится всё делать в cs файле, но везде, где не читаю литературу создают в XAML.
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
09.01.2015, 01:38
А как больше нравится, так и делайте. WPF очень демократичен в этом плане.

PS: Примеры делают в XAML для наглядности и рекламы декларативного подхода.
0
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
09.01.2015, 01:52  [ТС]
Спасибо за ответ! Сейчас читал информацию по этому поводу, и если честно, отчасти согласен с мнением, что, создание статических контролов и установка его свойств лучше делать в XAML, чтобы не забивать этой фигней сам cs файл. Но, с другой стороны, бегать туда-сюда из одного файла в другой как-то не очень, (в разных окнах у меня XAML и CS), возмонжо понравится работать с XAML, если появится второй монитор А вот еще вопрос, чисто личный: если вы реализуете интерфейс INotifyPropertyChanged, То описываете его в базовом класе модели или модели вида? Мне лично приглянулся первый вариант больше, потому что, если предположим, что если этот интерфейс реализован в модели вида, то, если свойство вдруг было изменено в самой модели, то как это передать-то в модель вида.
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
09.01.2015, 11:33
Цитата Сообщение от Pro100Tom Посмотреть сообщение
интерфейс INotifyPropertyChanged, То описываете его в базовом класе модели или модели вида?
В модели вида - по сути MV это частный случай контролера, соответственно интерфейс который отвечает за синхронизацию значений в модели и вьюшке должен быть частью контролера.
1
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
09.01.2015, 15:55  [ТС]
А вот еще вопрос. Разобрался, кстати, уже почти с MVVM. Пишу игру "Морской Бой". У меня есть модель Field - это игровое поле. Также есть всякие поля этого класса такие как Background, Width и так далее. В классе MainWindowViewModel я реализую логику создания этого поля, добавляю там клеточки и события мыши. И вот такой вопрос. В самой модели есть свойство типа bool, которое называется HideLegend и соответствующее ему поле hideLegend. У меня изначально был метод, который ищет TextBlock Control легенды и ставит ему visibility=hidden, когда я пишу HideLegend=true. А вопрос заключается вот в чём? Если свойство HideLegend находящееся в модели вызывает метод, то это ведь плохо для структуры MVVM? Все методы должны быть в соответствующем viewModel классе. И я могу реализовать этот метод в viewModel классе. Но мне тогда не будут нужно свойство HideLegend в самой модели. Но мне хотелось бы менять значение видимости легенды именно через свойство класса Field путём myField.HideLegend=true. В данном случае тогда и сам метод надо описывать тоже в классе модели, иначе получается путанница. Что делать?
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
09.01.2015, 17:45
А зачем методы нужны? Забиндить visibility текстбокса на это булево поле и делов то...
0
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
09.01.2015, 17:52  [ТС]
Дело в том, что в конве (Canvas), на которую я рисую, находится блок текста (TextBlock). И когда я устанавливаю значение hideLegend=true, то там должен запуститься метод который ищет этот блок текста, а после того как найдёт, прячет его.
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
09.01.2015, 17:54
Думаю это проблема архитектуры приложения, а не mvvm...
0
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
09.01.2015, 18:37  [ТС]
модель
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public bool IsLegendHidden
        {
            get { return isLegendHidden; }
            set
            {
                isLegendHidden = value;
                ToggleControl("Legend", hideLegend);
            }
 
private void ToggleControl(string hint, bool flag)
        {
            foreach (TextBlock textBlock in GameCanvas.Children.OfType<TextBlock>().Where(txtBlock => txtBlock.Name.Contains(hint)))
            {
                textBlock.Visibility = flag ? Visibility.Hidden : Visibility.Visible;
            }
        }
        }
Добавлено через 41 минуту
Блин, тогда ни черта не понимаю. В view у меня есть Canvas. Потом в ViewModel я создаю Canvas и добавляю в неё кучу Rectangle и Textblock, чтобы создать сетку, как в обычном морском бое. Делаю биндинг. У меня 100 квадратов в одном поле, мне что, каждый биндить к свойству hideLegend? Причём как забиндить-то, если hideLegend типа bool, а visibilty это вообще enum. Без метода не обойтись, куда его пихать. Ёмаё...
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
09.01.2015, 21:19
Ваша модель - это ваше поле. Любое изменение поля == изменение модели. Для привязки логического значения к перечислению используют конвертеры.
1
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
09.01.2015, 22:16  [ТС]
Спасибо большое за помощь. Я многое узнал благодаря вам. Извините, если достал своими вопросами. Немного правда, еще неясно. Но я наверное создам новую тему по одному из этих вопросов. Еще раз, благодарю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.01.2015, 22:16
Помогаю со студенческими работами здесь

Сравнение производительности С++ и С# на конкретном примере
Приветствую знатоков С++ ! Можно ли на С++ вычислить быстрее, чем на C#, переменные для решения уравнения x ^ 3 + y ^ 3 = z ^ 3 - 1 К...

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

Использование функции округления на конкретном примере
Как использовать функцию округления на конкретном примере: #include &lt;iostream&gt; #include &lt;Math.h&gt; using namespace std; int...

Оптимальная реализация построения БД на конкретном примере
Добрый день! Вопрос следующий: базу данных вроде как принято наполнять посредством добавления новых записей. А что если у меня...

Принцип работы цикла на конкретном примере
Приветствую, форумчане. Учу PHP. В процессе обучения наткнулся на пример использования данных из массива в цикле: &lt;?php ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru