|
Модератор
2939 / 1800 / 180
Регистрация: 19.02.2011
Сообщений: 6,556
|
|
Пытаюсь понять идеологию MVVM25.02.2020, 19:51. Показов 10249. Ответов 123
Метки нет (Все метки)
По предыдущему опыту (не C#) активно использовал MVC. Теперь пытаюсь понять идеологию MVVM. Не могу четко придумать, где должен быть контроллер или его аналог. Сейчас сижу, "курю" мануалы, пытаюсь осознать...[/OFF]
0
|
|
| 25.02.2020, 19:51 | |
|
Ответы с готовыми решениями:
123
Пытаюсь разобраться с WPF и MVVM и создать приложение Пытаюсь понять комбинаторику.Не могу понять какую формулу использовать Пытаюсь понять, не получается |
|
Модератор
2939 / 1800 / 180
Регистрация: 19.02.2011
Сообщений: 6,556
|
|||
| 07.04.2020, 15:02 [ТС] | |||
|
Когда будет перерыв - сделаю парочку набросков для реализации сохранения. Не по теме: Я новичок в C#, но не в программировании. Тем не менее всегда есть чему учиться ;) Жду следующих инструкций.
0
|
|||
|
Модератор
2939 / 1800 / 180
Регистрация: 19.02.2011
Сообщений: 6,556
|
|
| 07.04.2020, 15:18 [ТС] | |
|
Мы кнопочки оставим, но сделаем их не активными.
Что до продолжения сохраненной игры, то при наличии не завершенной покажем окошко, мол игра продолжена, игрок такой-то и такой-то, ход того-то.
0
|
|
|
Модератор
|
|
| 07.04.2020, 15:48 | |
|
View у нас будет однооконной, но с различными визуальными состояниями.
Для каждого из этих состояний View будет свой UserControl и каждому из них надо сначала задать интерфейсы Контекста Данных. Сами сможете их (интерфейсы) спроектировать? Добавлено через 18 минут Какие свойства VM нужны для исходного экрана?
Экран настроек (ISettingVM):
Так же для всех остальных экранов.
1
|
|
|
Модератор
2939 / 1800 / 180
Регистрация: 19.02.2011
Сообщений: 6,556
|
||||||
| 07.04.2020, 16:56 [ТС] | ||||||
|
Переименовал User в UserTypes. Создал класс User для хранения информации о пользователях.
Создал вот такой класс
0
|
||||||
|
Модератор
|
||||||||
| 07.04.2020, 17:58 | ||||||||
|
Интерфейс рассчитан на использование с WPF View, поэтому все члены должны быть публичными свойствами
Добавлено через 1 минуту TanaTiX, и раз мы делаем ПРАВИЛЬНО, то возьмите за привычку сразу добавлять теги документации Добавлено через 2 минуты Ещё рекомендация по "Правилам именования". В английском языке "главное" слово идёт последним: CommandSrartNewGame -> SrartNewGameCommand
1
|
||||||||
|
Модератор
2939 / 1800 / 180
Регистрация: 19.02.2011
Сообщений: 6,556
|
||||||||||||||||||||||||||
| 07.04.2020, 18:15 [ТС] | ||||||||||||||||||||||||||
|
Может что еще придумаю...
0
|
||||||||||||||||||||||||||
|
Модератор
|
||||||||||||||||||||
| 07.04.2020, 22:15 | ||||||||||||||||||||
|
Мы будем указывать интерфейс в Контексте Данных UserControl. И сможем указать только один интерфейс. Добавлено через 1 минуту ChangeUserPieceCommand что будет делать? Выбирать крестиками или ноликами играет? Тогда нам сюда нужно свойство (коллекция) с типом в котором значения фишек (CellContent) и ссылка на их изображение (ImageSource) Добавлено через 2 минуты Добавлено через 7 минут Добавлено через 3 часа 30 минут TanaTiX, после всех корректировок получаем пять интерфейсов для пяти UserControl. Создаём проект типа "Библитека пользовательских элементов управления WPF (Net Framework)" В нём добавляем ссылку на общую библиотеку. Создаём пять UserControl по одному для каждого экрана. Те UC что не имеют данных (только команды) в контексте данных устанавливаем d:DataContext="{x:Type Интерфейс}"Для тех интерфейсов у которых есть данные, сначала создаём Контекст Данных Времени Разработки. Например для интерфейса
Контекст данных для них подключаем так
1
|
||||||||||||||||||||
|
Модератор
2939 / 1800 / 180
Регистрация: 19.02.2011
Сообщений: 6,556
|
||||||
| 08.04.2020, 01:25 [ТС] | ||||||
|
Форматирование контролов примерно таким должно быть?
0
|
||||||
|
Модератор
|
||||||||||||
| 08.04.2020, 11:06 | ||||||||||||
|
Вроде так должно быть
Если данных нет - только команды. То можно временную VM не создавать. И тогда будет так
При задании контекста данных начинает правильно работать конструктор привязок. Можно задавать привязки через него - это уменьшит вероятность случайных ошиибок. Так же все поля отображающие данные мы теперь видим заполненными и сразу в конструкторе можем оценить их и отловить ошибки неправильных привязок.
1
|
||||||||||||
|
Модератор
2939 / 1800 / 180
Регистрация: 19.02.2011
Сообщений: 6,556
|
||||||||||||
| 08.04.2020, 12:06 [ТС] | ||||||||||||
d:DataContext="{x:Type comm:IFirstScreenVM}"Добавлено через 4 минуты В созданном проекте View создал папку Resources, там еще папка Images. Соответственно там изображения крестиков и ноликов. В проекте Common создал класс
0
|
||||||||||||
|
Модератор
2939 / 1800 / 180
Регистрация: 19.02.2011
Сообщений: 6,556
|
|||||||||||
| 08.04.2020, 21:11 [ТС] | |||||||||||
|
Создал пример визуального оформления статистики
0
|
|||||||||||
|
Модератор
|
||||||||||||
| 09.04.2020, 13:06 | ||||||||||||
|
Для этого нам надо добавить в Решение два проекта: ViewModel - Библиотека классов FW AppWPF - Приложение WPF FW. Нам надо задать навигатор для перемещения между экранами в одном окне. Один из вариантов его создания. Каждый экран это единственный в Окне UC. Переключать экраны будем методом в App. Чтобы в CB App было доступно наше единственное окно, в XAML убираем StartupUri и задаём обработчик Startup. См. тему Ресурсы приложения и запуск основного окна из Code-Behind App [WPF, Элд Хасп] В CB App создаём поле только для чтения и инициализируем его экземпляром Window задаём нужные параметры: размер по содержимому, позиция и т.д. Так каждому экрану у нас сопоставлен интерфейс, то переключение между экранами можно сделать по типу полученного интерфейса. Каждый экран у нас будет только в одном экземпляре. Поэтому для каждого создаём поле только для чтения с экземпляром UC. Задаём метод принимающий Type typeВ теле метода проверяем какой это интерфейс и записываем нужный UC в свойство Content Окна. Всё наш простенький навигатор готов. Теперь надо передать его в VM. Но её у нас пока нет... Начинаем её создавать. Добавлено через 18 минут Создавать VM будем в несколько шагов. Для начала добавим в общую библиотеку базовые классы отсюда: Новая реализация OnPropertyChangedClass [WPF, Элд Хасп] Новая реализация RelayCommand с исправлениями от proa33 и kolorotur [WPF, Элд Хасп] В проекте VM для начала создадим класс реализующий все интерфейсы. Он будет производным от OnPropertyChangedClass и через запятую надо указать все интерфейсы. Потом на каждом интерфейсе в "быстрых решениях" выбрать "Реализовать интерфейс". Получим "рыбу" которою надо доделать. Все свойства реализуем по такому подобию
Этот конструктор будет использоваться только для Режима Разработки. В данном случае он нам не нужен - у нас всё это уже сделано в View. Поэтому оставляем его пустым. Добавляем второй конструктор принимающий делегат метода навигатора в типе Action<Type>.Делегат метода сохраняем в поле только для чтения. Все команды для навигации инициализируем экземплярам RelayCommand. В исполнительный метод команды передаём вызов делегата навигатора с нужным типом интерфейса. Пока на этом с VM приостановим. Добавлено через 9 секунд Создавать VM будем в несколько шагов. Для начала добавим в общую библиотеку базовые классы отсюда: Новая реализация OnPropertyChangedClass [WPF, Элд Хасп] Новая реализация RelayCommand с исправлениями от proa33 и kolorotur [WPF, Элд Хасп] В проекте VM для начала создадим класс реализующий все интерфейсы. Он будет производным от OnPropertyChangedClass и через запятую надо указать все интерфейсы. Потом на каждом интерфейсе в "быстрых решениях" выбрать "Реализовать интерфейс". Получим "рыбу" которою надо доделать. Все свойства реализуем по такому подобию
Этот конструктор будет использоваться только для Режима Разработки. В данном случае он нам не нужен - у нас всё это уже сделано в View. Поэтому оставляем его пустым. Добавляем второй конструктор принимающий делегат метода навигатора в типе Action<Type>.Делегат метода сохраняем в поле только для чтения. Все команды для навигации инициализируем экземплярами RelayCommand. В исполнительный метод команды передаём вызов делегата навигатора с нужным типом интерфейса. Пока на этом с VM приостановим. Добавлено через 5 минут Теперь переходим к созданию VM в App. Делается это очень просто. В методе обработчика Startup прописываем создание экземпляра VM с передачей в конструктор метода навигатора. Этот экземпляр VM записываем в DataContext окна. И показываем окно. После этого можно делать пробный запуск приложения. Пока всё. Дальше после реализации всего этого.. Добавлено через 1 минуту Забыл! Перед показом окна надо вызвать метод навигатора с интерфейсам первого экрана.
1
|
||||||||||||
|
Модератор
2939 / 1800 / 180
Регистрация: 19.02.2011
Сообщений: 6,556
|
|
| 10.04.2020, 17:20 [ТС] | |
|
По мере погружения в xaml появился вопрос. Как в наших "окнах" использовать DataTemplate? Сам факт добавления тега вызывает ошибку, мол свойство Content используется более одного раза.
0
|
|
|
Модератор
|
||
| 10.04.2020, 17:25 | ||
|
Его экземпляр создаётся либо в ресурсе, либо в свойстве принимающим такой тип. Но где конкретно, в разрезе нашей задачи, вы собираетесь его применить? У нас же там нет ни одного пользовательского окна.
1
|
||
|
Модератор
2939 / 1800 / 180
Регистрация: 19.02.2011
Сообщений: 6,556
|
|
| 10.04.2020, 17:36 [ТС] | |
|
В настройках, мне подумалось, одного пользователя все же мало. Поэтому хочу создать 2 однотипных элемента для каждого из пользователей. Естественно под это все будут доработаны и модели, и интерфейсы.
0
|
|
|
Модератор
|
|||||||
| 10.04.2020, 17:40 | |||||||
1
|
|||||||
|
Модератор
2939 / 1800 / 180
Регистрация: 19.02.2011
Сообщений: 6,556
|
|||||||||||
| 13.04.2020, 15:24 [ТС] | |||||||||||
|
Пока концентрирую свое внимание на вью-части настроек.
Пока готово это:
Но есть вопросы. Как избавиться от выделения рамкой DataGridCell? Как настроить поведения кнопок для перелистывания списка только по одной штуке? А в идеале и зациклить, т.е. что бы после последнего элемента шел нулевой. Как подправить верстку, что бы избавиться от жестко заданных значений. Была еще идея через свойство менять часть шаблона (заголовок), но было принято решение просто оформить парочку текстовых полей вне шаблона. Если у кого-то будут мысли, то с удовольствием послушаю, если нет - не критично. P.S. Дизайн пока так себе, но как я понимаю, прелесть подхода в том, что его можно поменять когда угодно. Но "верстка" меняться не планируется.
0
|
|||||||||||
|
Модератор
|
||||
| 13.04.2020, 22:35 | ||||
|
Зачем вы его вообще всунули в шаблон? От там висит порожняком. Добавлено через 3 минуты Под каждое изменение заново компилировать программу? Раз есть список рисунков, View его должна получить от VM. А VM от App. App может получить его из настроек приложения. Добавлено через 56 секунд Раз Контролу нужны данные, а их нет в интерфейсе, то надо дополнить интерфейс этими данными. Добавлено через 6 минут Конектится он будет на свой интерфейс. Это интерфейс будет базовым для интерфейса настроек. В самом интерфейсе будет только одно свойство - список картинок в типе ImageSource. В само UС два дополнительных свойства: индекс картинки и индекс залоченной картинки (та которую надо пропускать). Кнопки делают инкремент/декремент индекса по модулю длины коллекции. Добавлено через 2 минуты TanaTiX, можно будет в этом контроле добавить анимацию "пролистывания" картинок.
0
|
||||
|
Модератор
2939 / 1800 / 180
Регистрация: 19.02.2011
Сообщений: 6,556
|
|
| 13.05.2020, 13:11 [ТС] | |
|
Итак, что произошло за это время. Необходимо немного оживить тему.
Был допилен тестовый "дизайн" (в кавычках потому что дизайном это назвать сложно) - тут речь про WPF и тестовые данные (в т.ч. с перфиксом d). Затем (а точнее параллельно) создана вьюмодель, снабжающая данными вью. В дальнейшем она перестроена на обмен данными между моделью и вью (INPC). На данный момент отладка приложения. Добавлен способ сохранения прерванной игры (в xml). Помимо этого использовали очень интересный, мощный и гибкий инструмент AttachedProperty (класс AProperty) - с его помощью реализовано "квадратное" поведение объектов, т.е. когда ширина равняется длине не зависимо от размера элемента. Таким образом есть связка от модели до вью.
0
|
|
| 13.05.2020, 13:11 | |
|
Основы MVC, пытаюсь понять код Я самоучка, пытаюсь понять квантовый мир
Пытаюсь понять логику человека, создавшего таблицу Написать программу в Excel, пытаюсь понять, но не получается Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek
ВВЕДЕНИЕ
Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
|
|
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
|
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2.
Задача:
Обеспечить запись документа в регистр сведений независимо от. . .
|
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется.
Ну как вам?
|
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания
источниках данных и элементов формы(текстовые поля и метки), опирается все
это на технологию событий и мета. . .
|