Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996

Генератор лабиринтов

02.09.2022, 23:40. Показов 3118. Ответов 38

Студворк — интернет-сервис помощи студентам
Здравствуйте, товарищи, вот собственно хочу сделать небольшую демку на WPF по генерации лабиринтов. алгоритмически проблем нет, а вот с тем как правильно все лепить на WPF MVVM есть путаница.

в качестве "заготовки" для генерации лабиринта будет квадратная решетка размера m*n (в идеале настраиваемая). изначально в каждой ячейке по 4 стены, потом по кнопке алгоритм запускается и потом за шаг алгоритма из стартовой ячейки в случайном направлении убираются стены в соседнюю клетку, а те клетки, которые в "Стеке" окрашиваются в какой-то цвет, ну алгоритм сам не особо важен, но в итоге убирания некоторых стенок в клетках получится лабиринт. в итоге имеем демонстрацию работы алгоритма наглядно и по шагам.

вот вопросы к знающим: как сделать UniformGrid, размеры которого подстроятся при изменении размеров решетки в текстбоксе (как сделать красиво чтобы не сильно портить MVVM). предположим что при смене размера уже сгенерированное будет сбрасываться и будет чистая квадратная решетка.

примерно такое имею ввиду:


понимаю как делать "влоб", но результатом доволен не буду, потому подскажите какие классы надо написать и что они будут делать чтобы был MVVM.

вообще есть ли что-то на роль "листбокса" для как раз таких целей? можно, конечно сделать одномерный массив и работать с ним, притвояясь что он двумерный, засунуть его в листбокс (ну или ItemsControl)

Нужна ли тут использовать модель? мне вообще кажется что нет, можно ли обойтись без нее только вьюшкой и вьюмоделью?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.09.2022, 23:40
Ответы с готовыми решениями:

Генератор лабиринтов
Создаю лабиринт с помощью кнопок. На них выбираю точку начала и точку конца. Относительно этих точек я хочу построить лабиринт. Чтобы...

Алгоритм генератора лабиринтов
Помогите пожалуйста. Нужен генератор лабиринта в двухмерном массиве(у меня это 15x15) с толстыми стенами и стенами по кругу. В конечном...

Генерация лабиринтов в двухмерном массиве
Нужно реализовать рандомный генератор лабиринтов в своей игре. Есть двухмерный (как стати правильно - двумерный или двухмерный?) массив,...

38
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
26.09.2022, 04:47
Студворк — интернет-сервис помощи студентам
golosalex, могу предположить, что если Вы сделаете окно шире, то всё будет как надо.
Мне кажется что последняя колонка не влезла и разбилась в строки.
0
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
26.09.2022, 05:10  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В вашем случае у вас в VM будет свойство Cells типа ReadOnly2DArray<Cell>.
Поэтому нужно задать привязку:
XML
1
2
3
                <ItemsPanelTemplate>
                    <UniformGrid Rows="{Binding Cells.Rows}" Columns="{Binding Cells.Columns}"/>
                </ItemsPanelTemplate>
такой фокус не работает. не пойму как правильно прибиндить
репозиторий: https://github.com/golosalex/l... ee/Develop

скрин ошибки:


стыдно признаться все работает, это я невнимателен был и написал вместо ModelsRows написал ModelRow и не заметил ошибку. жаль что иногда студия не хочет подсказывать имена свойств...

Добавлено через 4 минуты
Цитата Сообщение от limeniye Посмотреть сообщение
golosalex, могу предположить, что если Вы сделаете окно шире, то всё будет как надо.
Мне кажется что последняя колонка не влезла и разбилась в строки.
нет там все правильно, я просто неправильно в биндинге свойство назвал, и напридумывал себе что в ItemsPanelTemplate надо биндить как-то по-другому, полез в гугл, там нагуглил такое на стек оверфлов: https://stackoverflow.com/ques... dows-phone
пробовал и так и этак, чего только не посоветуют в интернетах, а студия меня предала и не подсказала мне имя свойства когда я его набирал, похоже ителисенс не будут править для WPF и придется страдать((
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
26.09.2022, 08:12
Цитата Сообщение от golosalex Посмотреть сообщение
репозиторий: https://github.com/golosalex/l... ee/Develop
Это "частный" репозиторий. Измените его настройки на "публичный".

Добавлено через 3 минуты
Цитата Сообщение от golosalex Посмотреть сообщение
жаль что иногда студия не хочет подсказывать имена свойств...
Если правильно инициализирован Контекст Данных Времени Разработки - то подсказывает.

Добавлено через 2 минуты
Цитата Сообщение от golosalex Посмотреть сообщение
, там нагуглил такое на стек оверфлов: https://stackoverflow.com/ques... dows-phone
Там обсуждается для Шаблона элемента (Custom Control), а не для Контента как у вас.
0
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
26.09.2022, 12:33  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это "частный" репозиторий. Измените его настройки на "публичный".
https://github.com/golosalex/l... ee/Develop - переделал, я думал, что репозитории на бесплатных тарифах всегда открытые.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если правильно инициализирован Контекст Данных Времени Разработки - то подсказывает.
в проекте что я привел, не подсказывает имена свойств в панельтемплайт. на скриншоте место отмечено.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Там обсуждается для Шаблона элемента (Custom Control), а не для Контента как у вас
изначально топикстартер описал проблему без како-то отношения к (Custom Control). а он был предложен как решение.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
26.09.2022, 12:44
Цитата Сообщение от golosalex Посмотреть сообщение
изначально топикстартер описал проблему без како-то отношения к (Custom Control). а он был предложен как решение.
Да. ТС не упоминал Custom Control.
В общем случае это имеет отношение к шаблону элемента. А их определение в основном используется в Custom Control.
Ему на это (что это можно использовать только в шаблоне элемента) указали в обсуждении и в ответе используется Custom Control.

Добавлено через 23 секунды
Цитата Сообщение от golosalex Посмотреть сообщение
переделал,
Посмотрю, но уже позже.
Как появится время.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
26.09.2022, 15:09
Цитата Сообщение от golosalex Посмотреть сообщение
C#
46
47
            _labyrinthData = new ReadOnly2DArray<Cell>(cells);
            _cellWatcher = new CellWatcher(LabyrinthData);
Не стоит так делать.
Поля хранящие значения свойств по функционалу должны быть инкапсулированы свойствами.
То есть нигде в коде кроме тела их свойств к таким полям не следует обращаться.
В данном случае это не вызывает логических ошибок, но в другом случае может вызвать.
Поэтому лучше сразу отвыкать от "плохих" приёмов кодинга.
C#
46
47
            LabyrinthData = new ReadOnly2DArray<Cell>(cells);
            CellWatcher = new CellWatcher(LabyrinthData);
Цитата Сообщение от golosalex Посмотреть сообщение
C#
9
      public class CellWatcher
Не пойму зачем этот класс нужен.
В нём же нет никакого функционала.

Добавлено через 58 минут
Цитата Сообщение от golosalex Посмотреть сообщение
C#
66
        public event EventHandler<Cell>? CellChanged;
Тоже какое-то бессмысленное событие.
По большому счёту здесь напрашивается реализация INPC.
Но если хочется сделать кастомное событие, то зачем два раза передавать this?
Нужно использовать или просто EventHandler или сделать свой нормальный аргумент события или даже делегат события.
Что-то в таком духе:
C#
1
public delegate void CellChangedHandler(Cell sender, string nameProperty, object oldValue, object newValue);
Добавлено через 11 минут
Цитата Сообщение от golosalex Посмотреть сообщение
C#
21
            set => Set<bool>(ref _leftWall, value);
Тип необязательно указывать, если он совпадает типами значений.
Достаточно так set => Set(ref _leftWall, value);

Добавлено через 5 минут
Цитата Сообщение от golosalex Посмотреть сообщение
C#
35
       public LabyrinthViewModel(LabyrinthModel model, Launcher launcher)
Launcher относится к слою View.
И VM никоим образом недолжна о нём что-либо знать.

Добавлено через 6 минут
golosalex, вы как-то через чур запутано и сложно делает.
Чем это вызвано?
Такое ТЗ?
0
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
26.09.2022, 17:11  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не стоит так делать.
Поля хранящие значения свойств по функционалу должны быть инкапсулированы свойствами.
То есть нигде в коде кроме тела их свойств к таким полям не следует обращаться.
Согласен с вами. я так и писал до того момента как поставил студию 2022. тут студия мне мозг колупает, что не nulleble поле не инициализированно в конструкторе. вот потому я в конструкторе их и инициализирую, чтобы студию успокоить. слышал что в конструкторе нормально инициализировать поля в обход свойства, а после настойчивых замечаний от студии решил уступить. к тому же мне показалось удобно, что студия следит чтобы я не забывал все инициализировать и пореже ловил nullreferenceexeption. есть ли способ как научить студию что инициализировать поля можно и через свойства?





Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не пойму зачем этот класс нужен.
В нём же нет никакого функционала.
как это нет? я хочу чтобы из модели торчало наружу 2 евента: первый уведомляет, что был создан новый массив из ячеек, а второй будет уведомлять, что какая-то ячейка изменилась и в аргументе евента показывать какая именно ячейка. первое решается тривиально, а вот для второго самое очевидное это сделать эвент изменения ячейки в классе Cell, и подписаться к каждой ячейкой в коллекции и при событии в любой из них вызывать событие в модели. мне показалось удобно вынести этот функционал наружу в отдельный класс, потому как счел это отдельной зоной ответственности. небольшая прослойка, которая объединяет подписку на все ячейки в одну подписку.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Тоже какое-то бессмысленное событие.
По большому счёту здесь напрашивается реализация INPC.
Но если хочется сделать кастомное событие, то зачем два раза передавать this?
Нужно использовать или просто EventHandler или сделать свой нормальный аргумент события или даже делегат события.
вероятно, вы правы и в том коде что имеется сейчас лучше без аргументов вызывать события и обойтись только obgect sender, но я не хочу с приведением и проверкой типов возиться, это же не считается дурным тоном?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Тип необязательно указывать, если он совпадает типами значений.
Достаточно так set => Set(ref _leftWall, value);
спасибо, не знал о такой фиче, но сейчас студия хорошо подсказывает, потому мне не сложно писать чуть длиннее. но буду знать если встречу в чужом коде.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Launcher относится к слою View.
И VM никоим образом недолжна о нём что-либо знать.
это к моему сожалению так, но это не большое отклонение, зато удобно, когда есть несколько окошек, через лаунчер ими управлять. к тому же это помогает принципам single responsibility. мне кажется хорошо когда есть отдельный класс, который управляет процессом создания окошек и инициализации их моделей и вью моделей. во всяком случае я не нашел ничего более удобного.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
golosalex, вы как-то через чур запутано и сложно делает.
Чем это вызвано?
Такое ТЗ?
отнють, готов вносить изменения в код)) и мне кажется, что есть общепринятые способы решения которых я просто еще не успел увидеть, потому код наполнен импровезацией, но я стараюсь делать все максимально прямолинейно.

идея у меня такая:
есть модель, из нее наружу торчат публичные свойства и события, которые будут говорить что какие-то свойства поменялись. в моем понимании критерий такой, что можно такой моделью пользоваться из консольного приложения и получить доступ ко всему функционалу без графического UI. в моем случае все получается. единственное что выдает такую модель - это события, подготовленные, чтобы привязаться из view модели (но без этого никуда). при таком подходе можно писать код модели воспринимая приложение как консольное.

дальше я где-нибудь в MIRO рисую как примерно будет выглядеть View и верстаю что-то похожее.

ну и в последнюю очередь делаю ViewModel. к сожалению МiewModel почти всегда получается похожей на Model и мучает соблазн пробрасывать связь напрямую Model - View, но я решил для себя честно конвертировать похожий объекты из модели во viewmodel даже если можно срезать.

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

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если правильно инициализирован Контекст Данных Времени Разработки - то подсказывает.
еще раз хотел бы уточнить, почему у меня не подсказывает студия возможные поля из dataContext?


конкретно в этом случае подсказывать отказывается, если научите что хочет от меня дизайнер и студия, то буду рад.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
26.09.2022, 20:53
Цитата Сообщение от golosalex Посмотреть сообщение
есть ли способ как научить студию что инициализировать поля можно и через свойства?
Нету.
Если свойство не допускает null, то должна быть такая реализация:
C#
14
15
16
17
18
19
20
21
22
23
24
25
26
       private CellWatcher _cellWatcher = new CellWatcher();
 
        //Свойства
        private CellWatcher CellWatcher
        {
            get => _cellWatcher;
            set
            {
                _cellWatcher = value ?? new CellWatcher();
                // Или 
                _cellWatcher = value ?? throw new ArgumentNullException(nameof(value));
            }
        }
Добавлено через 7 минут
Цитата Сообщение от golosalex Посмотреть сообщение
мне показалось удобно вынести этот функционал наружу в отдельный класс, потому как счел это отдельной зоной ответственности. небольшая прослойка, которая объединяет подписку на все ячейки в одну подписку.
Это лучше добавить в реализацию ReadOnly2DArray.
И чем ваше событие лучше типичного и всем известного INPC?

По функционалу, если вы ЗАМЕНЯЕТЕ Cell, то извещать об этом это функция коллекции или Модели.
Но если вы изменяете СВОЙСТВО Cell. то извещать об этом должна сам объект. Смысла прокидывать событие на уровнь коллекции или Модели нет.
Можно, конечно, реализовать в коллекции интерфейс IBindingList, но это сложно и избыточно - WPF всё равно с ним работает только как с INCC коллекции и INPC элементов.

Добавлено через 1 час 9 минут
Цитата Сообщение от golosalex Посмотреть сообщение
мне показалось удобно вынести этот функционал наружу в отдельный класс, потому как счел это отдельной зоной ответственности. небольшая прослойка, которая объединяет подписку на все ячейки в одну подписку.
Это лучше добавить в реализацию ReadOnly2DArray.
И чем ваше событие лучше типичного и всем известного INPC?

По функционалу, если вы ЗАМЕНЯЕТЕ Cell, то извещать об этом это функция коллекции или Модели.
Но если вы изменяете СВОЙСТВО Cell. то извещать об этом должна сам объект. Смысла прокидывать событие на уровнь коллекции или Модели нет.
Можно, конечно, реализовать в коллекции интерфейс IBindingList, но это сложно и избыточно - WPF всё равно с ним работает только как с INCC коллекции и INPC элементов.

Цитата Сообщение от golosalex Посмотреть сообщение
но я не хочу с приведением и проверкой типов возиться, это же не считается дурным тоном?
Дело не в дурном тоне.
Можно сделать Cell полноценными "модельками" - для этого достаточно в них добавить реализацию INPC.
И после этого можно их использовать вплоть до View.
Если хочется инкапсулировать их создание и изменение их свойств, то сделать тогда публичный интерфейс ICell и приватную вложенную реализацию в Модели типа Cell.
Всё намного упростится.

Цитата Сообщение от golosalex Посмотреть сообщение
который управляет процессом создания окошек и инициализации их моделей и вью моделей
Да, без проблем.
Но ViewМодель для чего об этом знать?
По функционалу - это даже не View, а уровень App.
И кроме App о нём никто не должен "знать".
0
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
26.09.2022, 20:58  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это лучше добавить в реализацию ReadOnly2DArray.
И чем ваше событие лучше типичного и всем известного INPC?
я использую ReadOnly2DArray и в модели и во вьюмодели, а массовую подписку я хочу делать только для модель=>вьюмодель, потому как view сама привяжется ко вьюмодели через INPC для каждой ячейки, а связь модель-вьюмодель надо вручную обеспечить. если перенести функционал массовой подписки в ReadOnly2DArray, то они не пригодятся во вьюмоделе, потому решил отдельно вынести. в принципе не думаю, что пустые события будут мешать, но в момент когда писал код решил так не делать.
не думаю что мое событие лучше чем INPC. просто для меня INPC это специфичное событие, сделанное под привязку. думаю могу по примеру игры 2024 повторить подход, но мне мой кажется проще.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но если вы изменяете СВОЙСТВО Cell. то извещать об этом должна сам объект. Смысла прокидывать событие на уровнь коллекции или Модели нет.
я тоже думал об этом, но из двух, на мой взгляд, похожих вариантов выбрал текущий. в любом случае существенное действие по подписке и отписке во всех ячейках придется как-то делать. я решил делать в модели, потому что у меня, модель изолированна, и ее проще как-то протестировать на предмет ошибок. вот я и в отдельном проекте создал экземпляр модели и убедился, что все подписки работают в соответствии с ожиданиями.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
26.09.2022, 21:02
Цитата Сообщение от golosalex Посмотреть сообщение
почему у меня не подсказывает студия возможные поля из dataContext?
Пока не было времени загрузить и запустить репозиторий.
Как появится - разберусь поглубже.

Добавлено через 2 минуты
Цитата Сообщение от golosalex Посмотреть сообщение
в любом случае существенное действие по подписке и отписке во всех ячейках придется как-то делать.
Вы же создаёте прокси на уровне VM - CellViewModel.
Вот он пусть и прослушивает изменения свойств Cell.
0
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
26.09.2022, 21:05  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но ViewМодель для чего об этом знать?
я обычно использую команды, чтобы какое-то окно открыть-закрыть. пока мне это не пригодилось, но очень удобно иметь во вьюмодельке "прикопанный" экземпляр лаунчера, чтобы через команды открывать и закрывать окна. можно, наверно, через Application.Curent идти искать лаунчер, но это же сути не изменит. для других целей я лаунчер не юзаю и потому шаблон он никогда мне не портил.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
26.09.2022, 21:10
Вот что-то подобное должно быть:
C#
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  public class CellViewModel:BasePropertyChanged
    {
        private Cell cell;
 
        public bool LeftWall
        {
            get => cell. LeftWall;
        }
 
        // Может быть не метод, а команда
        public void SetLeftWall(bool value)
            => cell. LeftWall = value;
 
         // И прослушка Cell 
         private void OnCellChanged(....)
         {
             if (изменилось свойство LeftWall)
                 RaisePropertyChanged(nameof(LeftWall));
         }
Добавлено через 2 минуты
Цитата Сообщение от golosalex Посмотреть сообщение
я обычно использую команды, чтобы какое-то окно открыть-закрыть.
Это воще жесть...!!!

Вы же стремитесь правильную реализацию написать.
А в правильной реализации VM должна уметь работать с View любого типа. Даже с Консолью.
И как ваша VM будет в консоли окна открывать?

Должны быть диалоги которые внедряются в VM при её создании.
А что там за логика в диалоге VM знать не нужно.
Может окно откроется, а может в файл что-то будет записано/прочитано.
0
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
26.09.2022, 21:21  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это воще жесть...!!!
а как тогда быть?
теоритическая возможность работать VM с любой View это, конечно, хорошо, но я не находил удобного способа открывать окошки, как View может создать окошко, на основании уже существующей модели(или ее части), которую отделяет аж 2 стены? а потом еще и закрыть его.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
26.09.2022, 21:30
Цитата Сообщение от golosalex Посмотреть сообщение
а как тогда быть?
Я же написал: внедрять диалоги, а не Окна.
В диалоге уже может быть инкапсулировано создание и открытие окна. Но VM об этом не будет знать.

Добавлено через 2 минуты
golosalex, я вам советую с учебной целью, для практики разделить все слои приложения по разным проектам.
Тогда вам будет проще понять, кто, что и о ком должен "знать".

Структура связей в WPF Решении
Структура WPF решения
Потоки в асинхронном MVVM
Структура WPF+БД решения
0
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
26.09.2022, 21:35  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я же написал: внедрять диалоги, а не Окна.
а есть ли у вас какой-то простой пример где это реализованно?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
26.09.2022, 22:13
Цитата Сообщение от golosalex Посмотреть сообщение
а есть ли у вас какой-то простой пример где это реализованно?
Не раз это в темах раздела показывал.
Надо поискать.

Добавлено через 2 минуты
Как правильно в MVVM реализовать сервис диалогов?

Добавлено через 1 минуту
Для начала освойте сам принцип создания диалогов.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
27.09.2022, 10:33
golosalex, давайте подойдём концептуально к решению, раз вы хотите сделать максимально правильную реализацию.

Требования к Модели сформируем в виде её интерфейса.

1) В Модели есть матрица ячеек. Изменять ячейки может только Модель. Соответственно, ячейка доступна только через иммутабельный интерфейс или DTO. Для изменения свойства нужно заменять полностью экземпляр;

2) Для создания матрицы нужен публичный метод с её размерами;

3) Возможно нужен метод для изменения размера матрицы;

4) Нужен метод для изменения ячейки;

5) Событие извещающее о создании (или изменении) матрицы. В параметре события аргумент со свойствами: строк, колонок, список (последовательность) новых ячеек;

6) Событие извещающее о замене ячейки. В параметре изменённая ячейка.


Этого достаточно на работы с БЛ Модели? Или ещё что-то надо?

Добавлено через 1 минуту
Интерфейс Модели (и типов которые он используется) создаётся в отельном проекте.
Модель его реализующая будет в другом отдельном проекте.
0
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
27.09.2022, 19:50  [ТС]
если делать ячейки иммутабельными и пересоздавать их при изменении любой стенки или внутреннего состояния (входит в стек алгоритма, изолирована или в массиве) то не будет ли лишнего гемора при создании связи от модели ко вью? такой вариант я рассматривал, но отказался в пользу обычных свойств. вообще мне нравиться больше вариант сделать структуру с перечислением всех стенок и вот его уже сделать иммутабельным. как вы и предлагали вначале.

думал сначала доделать реализацию нескольких алгоритмов генерации, подправить верстку, чтоб было покрасивее, а потом взяться за рефакторинг и сделать правильную реализацию, потому как код MVVM (но с некоторыми оговорками) уже чудесным образом работает и все что я делаю в модели корректно отображается в окошке.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
27.09.2022, 20:11
Цитата Сообщение от golosalex Посмотреть сообщение
если делать ячейки иммутабельными и пересоздавать их при изменении любой стенки или внутреннего состояния (входит в стек алгоритма, изолирована или в массиве) то не будет ли лишнего гемора при создании связи от модели ко вью?
Наоборот всё значительно упростится.

Цитата Сообщение от golosalex Посмотреть сообщение
вообще мне нравиться больше вариант сделать структуру с перечислением всех стенок и вот его уже сделать иммутабельным.
Структуру можно не делать иммутабельной.
Её передача всегда порождает новый экземпляр, поэтому изменение её свойства вне Модели ни как на БЛ влиять не будет.

Цитата Сообщение от golosalex Посмотреть сообщение
а потом взяться за рефакторинг и сделать правильную реализацию
Изменение Модели может значительно повлиять на все остальные слои.
На мой взгляд, всегда лучше сначала Модель "довести до ума".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.09.2022, 20:11

Как написать программу по созданию лабиринтов
Здраствуйте уважаемые форумчани! Помогите пожалайсту с такой бедой: нужно написать програму в Microsoft Visual Studio 2010 на языке C#...

Как переделать программу для генерации лабиринтов по алгоритму Эллера в WinForms?
Здравствуйте! Я написала программу для генерации лабиринтов по алгоритму Эллера. Но написала я ее для консоли. И теперь, пользуясь этим...

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

Генератор лабиринтов
Всем привет! Не мог бы кто-нибудь подсказать, как сделать так, чтобы карта генерировались как в каком-нибудь простеньком rogulike-игре?...

Разработать генератор случайных лабиринтов
Разработать генератор случайных лабиринтов и программу, отображающую путь выхода из лабиринта.


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru