
Dmitriy
16.03.2018
12:21:52

vladimir
16.03.2018
12:22:05
код можно?
MakePage должна быть независима от await Indicator

Google

vladimir
16.03.2018
12:23:25
вызови свой Indicator в констркторе своей страницы с Task.Run(Indicator);
ну и там скорее всего будет ошибка с изменением состояния индикатора не на UI потоке, потому нужны баиндинги, но хотя бы до этого момента надо дойти %)
и MakePage не нужен будет async, её тоже прямо в констрктор засунь

Dmitriy
16.03.2018
12:33:08
Индикатор работает и пропадает, как я понимаю, в нужный момент
но stacklayout начальный остаётся и новый не появляется
То есть пустой экран получается

vladimir
16.03.2018
12:35:38
а как выглядит Indicator метод?

Dmitriy
16.03.2018
12:39:59

vladimir
16.03.2018
12:43:10
ээ, так ты хочешь, чтобы индикатор крутился пока грузится другая вьюшка?
так нельзя
я думал, там данные какие-то прогружаюся

Dmitriy
16.03.2018
12:45:58
Совсем нельзя?

Ekaterina
16.03.2018
12:46:00
Лучше почитайте на msdn
Мне все равно не до конца понятен mvvm. Действия в случае нажатия на кнопку сохранения, получения данных и т д нужно вынести в view model? А если есть кнопка, при нажатии на которую появляется картинка или меняется цвет элемента на странице, это надо куда-то выносить?

Google

Iván
16.03.2018
12:48:04
да если это требуется на всех платформах
но картинка же из VM запросится, как и цвет

Alex
16.03.2018
12:54:35

vladimir
16.03.2018
12:56:07

Iván
16.03.2018
12:57:37
Model не должна отражать ViewModel, там свой мир

Gleb
16.03.2018
12:58:51

Iván
16.03.2018
13:00:55
ViewModel это такой слой-конвертер где собираются все сырые данные с Model и компонуются под передачу в UI
идеальная ViewModel это когда она может работать и тестироваться без подключённого UI в принципе
поэтому когда пишешь код VM можно постоянно задавать себе вопрос "а сможет ли это работать без UI? а смогу ли я подключить ещё одну платформу сюда?" чтобы понимать не "течёт" ли VM во View
Model же состоит из запросов в сеть, БД, там нет ни намёка на UI и структуру аппа
(и опять же, правильно спроектированная Model может работать и тестироваться без подключённой ViewModel)

Ekaterina
16.03.2018
13:06:06
Если везде command использовать

Iván
16.03.2018
13:11:18
слабо знаю XF (пишу MvvmCross + native), но согласно этой статье и не особо нужны
знатоки XF поправят )
https://blog.xamarin.com/simplifying-events-with-commanding/


Кита
16.03.2018
13:12:45
Мне все равно не до конца понятен mvvm. Действия в случае нажатия на кнопку сохранения, получения данных и т д нужно вынести в view model? А если есть кнопка, при нажатии на которую появляется картинка или меняется цвет элемента на странице, это надо куда-то выносить?
ViewModel канонический - это по сути Interactor из VIPER содержащий не UseCase(детализация, описание действия, которое может совершить пользователь системы, т.е часть бизнес-логики) как это принято, а набор состояний вью. Неканоничной она становится обычно тогда когда в ViewModel смешивают состояния с usecase чтобы “не плодить сущности, ну и так тупо удобнее”, т.е смешивают бизнес-логику и состояния экрана в единое, описывают делегаты команд во вьюмодели, хотя это чистый usecase, который надо выносить отдельно, но для удобства он пишется там же. Что касается картинки которую надо показывать на вью - то конечно тут двойственная ситуация потому как с одной стороны картинки это данные, которые надо закачать от куда-то и показать и в тоже время на каждой платформе свои классы для bitmap-изображений. Тем не менее есть 2 пути - либо у контрола отображающего картинки свой доступ к http-клиенту который по сути является провайдером данных и вы скармливаете контролу просто url по которому лежит изображение и контрол сам скачивает его, кэширует итд(так делает XF), либо вы делаете так чтобы из ViewModel к ImageView через ваш gateway-механизм(Repository, API) прилетал byte[] и ImageView сам этот массив преобразовывал в те платформо-зависимые классы в которые надо на конкретной платформе


Iván
16.03.2018
13:14:55
> Interactor из VIPER
не самый простой пример новичкам ?

Ekaterina
16.03.2018
13:15:01

Iván
16.03.2018
13:16:07
доки Apple, доки Android, но что-то одно
я знаю первый, второй делаю впервые – просто заглядываю в доки и гуглю туториалы по андроиду


Кита
16.03.2018
13:19:30
ViewModel канонический - это по сути Interactor из VIPER содержащий не UseCase(детализация, описание действия, которое может совершить пользователь системы, т.е часть бизнес-логики) как это принято, а набор состояний вью. Неканоничной она становится обычно тогда когда в ViewModel смешивают состояния с usecase чтобы “не плодить сущности, ну и так тупо удобнее”, т.е смешивают бизнес-логику и состояния экрана в единое, описывают делегаты команд во вьюмодели, хотя это чистый usecase, который надо выносить отдельно, но для удобства он пишется там же. Что касается картинки которую надо показывать на вью - то конечно тут двойственная ситуация потому как с одной стороны картинки это данные, которые надо закачать от куда-то и показать и в тоже время на каждой платформе свои классы для bitmap-изображений. Тем не менее есть 2 пути - либо у контрола отображающего картинки свой доступ к http-клиенту который по сути является провайдером данных и вы скармливаете контролу просто url по которому лежит изображение и контрол сам скачивает его, кэширует итд(так делает XF), либо вы делаете так чтобы из ViewModel к ImageView через ваш gateway-механизм(Repository, API) прилетал byte[] и ImageView сам этот массив преобразовывал в те платформо-зависимые классы в которые надо на конкретной платформе
Что касается Model, то это не Entity как это принято считать и не POCO. Это система классов которая описывает и DataProviderы (http, localDB) и маппинг POCO в Entity и кэширование данных если надо, и сам usecase, т.е пользовательский сценарий, который работает в итоге с Entity и её внутренней бизнес-логикой.


Ekaterina
16.03.2018
13:20:32
ViewModel канонический - это по сути Interactor из VIPER содержащий не UseCase(детализация, описание действия, которое может совершить пользователь системы, т.е часть бизнес-логики) как это принято, а набор состояний вью. Неканоничной она становится обычно тогда когда в ViewModel смешивают состояния с usecase чтобы “не плодить сущности, ну и так тупо удобнее”, т.е смешивают бизнес-логику и состояния экрана в единое, описывают делегаты команд во вьюмодели, хотя это чистый usecase, который надо выносить отдельно, но для удобства он пишется там же. Что касается картинки которую надо показывать на вью - то конечно тут двойственная ситуация потому как с одной стороны картинки это данные, которые надо закачать от куда-то и показать и в тоже время на каждой платформе свои классы для bitmap-изображений. Тем не менее есть 2 пути - либо у контрола отображающего картинки свой доступ к http-клиенту который по сути является провайдером данных и вы скармливаете контролу просто url по которому лежит изображение и контрол сам скачивает его, кэширует итд(так делает XF), либо вы делаете так чтобы из ViewModel к ImageView через ваш gateway-механизм(Repository, API) прилетал byte[] и ImageView сам этот массив преобразовывал в те платформо-зависимые классы в которые надо на конкретной платформе
Просто не будет ли намного проще и естественнее использовать обработчики событий? Хотя бы для простейших действий, ничего не тянуть из vm просто поменять свойство какого - нибудь элемента страницы (скрыть его например)


Iván
16.03.2018
13:20:41
> Неканоничной она становится обычно тогда когда в ViewModel смешивают состояния с usecase чтобы “не плодить сущности, ну и так тупо удобнее”, т.е смешивают бизнес-логику и состояния экрана в единое, описывают делегаты команд во вьюмодели, хотя это чистый usecase, который надо выносить отдельно, но для удобства он пишется там же.
@ptytz разнести можно, но много ли выгоды с этого? особенно когда экраны простые и команда 1-3 человека?

Кита
16.03.2018
13:21:05

Google

Кита
16.03.2018
13:21:54
Надо безусловно разделять проекты по времени их жизни
Просто случается так что сделав что-то по простому этот же подход тащят в уже сложное, хотя его очевидно не достаточно

Iván
16.03.2018
13:26:23
про смешивание напомнило вот этот цикл статей (если лень читать всё, то выводы в пятой части)
https://ericlippert.com/2015/04/27/wizards-and-warriors-part-one/
про разделение команд и состояний

Alex
16.03.2018
13:30:17

Ekaterina
16.03.2018
13:30:50

Кита
16.03.2018
13:31:04
ровно по той причине что viewmodel реализует главный интерфейс без которого ничего бы не вышло - INotifyPropertyChange
Тогда как презентер точно и 100% “знает” о View

Alex
16.03.2018
13:34:59
а vm не знает о view?

Кита
16.03.2018
13:35:21
Вьюмодель ничего не знает, хранит состояния и нотифицирует об изменении данных тех кто “подписан” на неё
фишка в том что вот это подписание и обработка эвента PropertyChange оно происходит за кулисами. Обычно программисту ничего об этом неизвестно. Он создал страницу, дал ей биндинг-контекстом вьюмодель и написал биндинги либо кодом либо в разметке - и оно заработало, “магия” случилась

vladimir
16.03.2018
13:39:25
ViewModel - это абстрактная такая штука, которую мы делаем таким образом, как хотим, чтобы View выглядела
общие свойства и команды View реализует ViewModel
если можно так объяснить о_.

Alex
16.03.2018
13:41:48
правильно понимаю что vm должна подписаться на модель чтобы оповестить ui когда что-то поменялось?

Кита
16.03.2018
13:43:10
правильно понимаю что vm должна подписаться на модель чтобы оповестить ui когда что-то поменялось?
ну обычно конечно модель не живет сама по себе в воздухе и не обновляет данные сама. Запрос данных это часть сценария. Соответственно обычно поход за данными это какой-то Task, который можно подождать) Дождался завершения работы таска после await и можешь брать результат выполнения этого таска и всобачивать его в проперть и менять таким образом состояние и как следствие автоматически оповещать вью для того чтобы она заново зачитала проперть

vladimir
16.03.2018
13:45:05
ViewModel грузит Model, потом ViewModel загруженные данные присваивает свойствам
а так как наша View привязала свои свойства соответствующие к свойствам ViewModel, то View изменяется внешне

Alex
16.03.2018
13:45:32
получается при нажатии на кнопку происходит как-то так var res = await Model.GetResult(); ? т.е. такой минимум логики?

vladimir
16.03.2018
13:45:52
если глубже идти, то есть двухсторонняя привязка (текстовое поле, например)
когда привязанные свойства View обновляют свойства ViewModel

Google

Ekaterina
16.03.2018
13:46:26
Так чтобы менять в vm свойства элементов страницы, нужно их передать в эту vm?

vladimir
16.03.2018
13:46:48
да

Кита
16.03.2018
13:46:58

Alex
16.03.2018
13:47:03
про vm<->view все понятно) не понятно именно как логика пишется. Кто-то фигачит прям во viewmodel, но это ж получается потом видимо massive vm.

vladimir
16.03.2018
13:47:34
с чего это?
а как изменить свойства страницы, которая к VM привязана?

Кита
16.03.2018
13:47:52

Slava
16.03.2018
13:48:09

vladimir
16.03.2018
13:48:10

Кита
16.03.2018
13:48:24

vladimir
16.03.2018
13:49:33
про некоторое абстрактное свойство страницы, которое нужно обновить
оно привязано к некоторому абстрактоному свойство VM, и, соответственно, чтобы обновить свойство страницы, мы обновляем свойство VM
а про проблемы соответствия типов свойств никто не спрашивал

Кита
16.03.2018
13:50:05

vladimir
16.03.2018
13:50:39
теперь я сам не пойму
можно перефразировать вопрос?

Кита
16.03.2018
13:51:06
ну я и ответил что в эту VM ничего не передается. Просто страница держит список биндингов(привязок) и важно чтобы 1 проперти вью по типу совпадала с пропертью вьюмодели(а если не совпадает то конвертер добавить). И при этом чтобы вьюмодель работала с платформо-независимыми типами

vladimir
16.03.2018
13:51:19

Ekaterina
16.03.2018
13:52:00
а что? может я недопонял
У нас есть элемент на странице, который нужно скрыть при нажатии на кнопку. Сейчас у меня на есть обработчик события click в коде страницы.

vladimir
16.03.2018
13:52:12
click привязывается к команде в VM, команда меняет некоторое булево свойство, отвечающее за видимость элемента на странице
свойство видимости элемента на странице в свою очередь привязано к этому булеву свойству в VM

Google


Bonart
16.03.2018
13:54:49
ViewModel канонический - это по сути Interactor из VIPER содержащий не UseCase(детализация, описание действия, которое может совершить пользователь системы, т.е часть бизнес-логики) как это принято, а набор состояний вью. Неканоничной она становится обычно тогда когда в ViewModel смешивают состояния с usecase чтобы “не плодить сущности, ну и так тупо удобнее”, т.е смешивают бизнес-логику и состояния экрана в единое, описывают делегаты команд во вьюмодели, хотя это чистый usecase, который надо выносить отдельно, но для удобства он пишется там же. Что касается картинки которую надо показывать на вью - то конечно тут двойственная ситуация потому как с одной стороны картинки это данные, которые надо закачать от куда-то и показать и в тоже время на каждой платформе свои классы для bitmap-изображений. Тем не менее есть 2 пути - либо у контрола отображающего картинки свой доступ к http-клиенту который по сути является провайдером данных и вы скармливаете контролу просто url по которому лежит изображение и контрол сам скачивает его, кэширует итд(так делает XF), либо вы делаете так чтобы из ViewModel к ImageView через ваш gateway-механизм(Repository, API) прилетал byte[] и ImageView сам этот массив преобразовывал в те платформо-зависимые классы в которые надо на конкретной платформе
Неканоничной ViewModel становится, когда забывают, что это не сущность, а слой, куда входит как видимое пользователю состояние системы, так и доступные пользователю команды для его изменения


Кита
16.03.2018
13:56:11

Ekaterina
16.03.2018
13:57:21

vladimir
16.03.2018
13:58:32
прям всех вряд ли получится, но большинство да

Ekaterina
16.03.2018
13:59:31
А сама страница просто содержит определённый набор элементов, ссылку на vm? Без каких-либо обработчиков

Bonart
16.03.2018
13:59:37
Бизнес-логика должна быть в модели. Вью-модель отвечает не за бизнес-логику, а за состояние и поведение пользовательского интерфейса.

Ekaterina
16.03.2018
14:01:21
Спасибо) стало намного понятнее ))

Alex
16.03.2018
14:07:29
А такой еще вопрос - если у нас страница и на ней много независимых компонентов со своими model/view/vm, как это все работает? Родительский vm держит vm потомков?

vladimir
16.03.2018
14:07:45
да

Alex
16.03.2018
14:09:46
спасибо

Кита
16.03.2018
14:12:41

Iván
16.03.2018
14:41:30
в MvvmCross кстати есть Presenter уже готовый, но у них документация конечно ...непростая

Кита
16.03.2018
17:01:30
Это не Presenter у них а Controller(но не чистый). Разницу прочувствовать может только познавший дзен) В итоге mvvmCross на самом деле предлагает паттерн MVCVM (не путать с MVVMC ?)

Artur
16.03.2018
18:41:45
публикую приложение Xamarin.Android в Play market, в debug и release google maps работают, подпись приложения одно и тоже sha-1 верный, но если скачиваю с маркета не работает, сталкивался кто? подскажите в каком направлении смотреть, а то уже не знаю, что делать

Алексеев
17.03.2018
06:53:42

Artur
17.03.2018
08:01:04

Den
17.03.2018
08:46:47