@xamarin_russia

Страница 618 из 619
Кита
26.10.2018
10:31:36
и с NSObejct и c Java должны. По крайней мере в VS for Mac

Boris
26.10.2018
10:33:24
Ну так мы же не видим код базового класса на Java/ObjC. Где в таком случае мы увидим ворнинг?

Проверка орфографии в скайпе говорит, что не знает никакого шумарина ?



Google
Кита
26.10.2018
10:37:05
Boris
26.10.2018
10:37:41
Сигнатуры видны в мета-дате, да

Но ворнингов по мета-дате пока не встречал

Я думаю в выходные поглубже эту тему покопать чтобы понять как надежно избегать таких проблем

Кита
26.10.2018
10:42:07
Просто не вызывать virtual в конструкторе. А если вызывать то в методе должно происходить что-то не влияющее на общую логику класса

vladimir
26.10.2018
10:45:08
today I learnt, что базовый конструктор всегда вызовется автоматически даже если не указан явно -_-

Boris
26.10.2018
10:46:02
today I learnt, что базовый конструктор всегда вызовется автоматически даже если не указан явно -_-
А как иначе) Если у базового класса есть какие-то приватные поля и они заполняются в конструкторе, например

vladimir
26.10.2018
10:46:47
да это понятно, но до этого я думал, что его надо явно прописать типо Derived() : base()

в общем, спасибо, почувствовал себя глупым

https://stackoverflow.com/questions/159296/how-can-i-prevent-a-base-constructor-from-being-called-by-an-inheritor-in-c

второй ответ интересный

Boris
26.10.2018
10:49:45
Да. Интересный. Для сериализаций и правда может понадобиться

Или для юнит-тестов каких-то

Google
Alexander
26.10.2018
11:20:40
Думаю на днях появится
Не появился ещё? Игде отслеживать если что??

Kirill
26.10.2018
11:22:01
Alexander
26.10.2018
11:22:13
не. Напишу когда
О! на UWP помогло view.Layout(size);

Bulat
26.10.2018
11:54:55
Я уже сделал через grouping

Alexander
26.10.2018
12:50:57
О! на UWP помогло view.Layout(size);
А как теперь размер выставить в Auto. ?

Dmitry
26.10.2018
13:39:50
Всем привет, вопрос от начинающего (ногами не бить плиз). 1. Xamarin Forms. 2. Есть переход с RegisterPage на OnBoardingPage. При клике на кнопке RegisterPage происходит await Navigation.PushModalAsync(new OnBoardingPage()). 3. У OnBoardingPage есть ViewModel с состояниями экранов, два из которых Loading и Normal. 4. У этой же ViewModel есть асинхронный метод public async void SetPanelTagsCollection(), который обращается к серверу и возвращает коллекцию объектов. 5. Задача — при переходе на OnBoardingPage, отобразить состояние Loading, асинхронно запустить SetPanelTagsCollection(), дождаться результатов и после этого отобразить состояние Normal. Как это корректно сделать? Не получается - то Loading застывает на экране (при этом SetPanelTagsCollection() грузится корректно, видно при свайпе на второй экран онбординга), то при переходе RegisterPage -> OnBoardingPage пропускается Loading и с подвисанием экран грузится с Normal.

vladimir
26.10.2018
13:43:21
вы используете баиндинги?

Maxim
26.10.2018
13:46:11
Всем привет, вопрос от начинающего (ногами не бить плиз). 1. Xamarin Forms. 2. Есть переход с RegisterPage на OnBoardingPage. При клике на кнопке RegisterPage происходит await Navigation.PushModalAsync(new OnBoardingPage()). 3. У OnBoardingPage есть ViewModel с состояниями экранов, два из которых Loading и Normal. 4. У этой же ViewModel есть асинхронный метод public async void SetPanelTagsCollection(), который обращается к серверу и возвращает коллекцию объектов. 5. Задача — при переходе на OnBoardingPage, отобразить состояние Loading, асинхронно запустить SetPanelTagsCollection(), дождаться результатов и после этого отобразить состояние Normal. Как это корректно сделать? Не получается - то Loading застывает на экране (при этом SetPanelTagsCollection() грузится корректно, видно при свайпе на второй экран онбординга), то при переходе RegisterPage -> OnBoardingPage пропускается Loading и с подвисанием экран грузится с Normal.
А эти экраны как меняют друг друга?Свойство видимости биндите?

Dmitry
26.10.2018
13:48:08
В Xaml <stateContainer:StateContainer x:Name="StateContainerBoarding" State="{Binding OnBoardingInState}"

В Xaml в описании каждой из 5 страниц

ViewModel общая на весь CarouselPage (она же OnBoardingPage) включающий 5 страниц ContentPage. На каждой ContentPage свой StateContainer и Binding

vladimir
26.10.2018
13:54:55
если есть привязки, то просто ставьте состояние Loading перед SetPanelTagsCollection и Normal после о_о

а где сам SetPanelTagsCollection вызывается?

Maxim
26.10.2018
13:55:18
Dmitry
26.10.2018
13:56:18
а где сам SetPanelTagsCollection вызывается?
public ScopeOfHelpViewModel() { if (!CrossConnectivity.Current.IsConnected) { MessageText = "Нет интернет-соединения"; OnBoardingInState = OnBoardingState.NoInternet; } else { Device.BeginInvokeOnMainThread(async () => { MessageText = "Загружаю данные"; OnBoardingInState = OnBoardingState.Loading; }); SetPanelTagsCollection();

vladimir
26.10.2018
13:56:38
ага

Google
vladimir
26.10.2018
13:57:09
Task.Run(SetPanelTagsCollection);

оно же весь конструктор блокирует

и ничего там асинхронного нет в таком случае

Dmitry
26.10.2018
13:58:05
Task.Run(()=>SetPanelTagsCollection()); ?

vladimir
26.10.2018
13:58:22
можно как я написал

а вот это OnBoardingInState = OnBoardingState.Loading; а затем и Normal ставьте внутри SetPanelTagsCollection и можно без Device.BeginInvokeOnMainThread

хотя, когда будете присваивать коллекцию модели к коллекции VM, то лучше использовать Device.BeginInvokeOnMainThread

Dmitry
26.10.2018
14:05:05
хотя, когда будете присваивать коллекцию модели к коллекции VM, то лучше использовать Device.BeginInvokeOnMainThread
С вызовом Task.Run(() =>SetPanelTagsCollection()); я пробовал сам - запускается все последовательно, как надо, и Device.BeginInvokeOnMainThread(async () => { OnBoardingInState = OnBoardingState.Normal; }); в конце SetPanelTagsCollection() отрабатывает, но в итоге интерфейс не отображает коллекцию тегов на второй странице OnBoarding.

Сейчас внутренности SetPanelTagsCollection() опишу

vladimir
26.10.2018
14:06:08
а ваше свойство коллекции вызывает NotifyPropertyChanged?

vladimir
26.10.2018
14:17:35
покажите, как объявлено ServerTagsCollection

Dmitry
26.10.2018
14:19:18
public ObservableCollection<ScopeOfHelp> ServerTagsCollection = new ObservableCollection<ScopeOfHelp>();

Maxim
26.10.2018
14:19:40
А почему коллекция не свойством?:)

{get; set;}

vladimir
26.10.2018
14:20:00
OnPropertyChanged("ServerTagsCollection"), во-первых (или nameof) во-вторых, это не должно быть на каждой итерации в-третьих, это лучше всего делается внутри свойства коллекции

Maxim
26.10.2018
14:21:04
Я тоже так думаю
public ObservableCollection<ScopeOfHelp> ServerTagsCollection {get; set;} = new ObservableCollection<ScopeOfHelp>() ;

vladimir
26.10.2018
14:21:16
нужно обновиться своство само

Google
vladimir
26.10.2018
14:21:32
и уж тем более не делать это на каждом добавленном элементе

создайте локальный List<ScopeOfHelp> list в него все ваши new ScopeOfHelp добавляйте а потом ServerTagsCollection = new ObservableCollection<ScopeOfHelp>(list)

Dmitry
26.10.2018
14:23:44
Я пробую все чт овы предлагаете, отпишусь, 5 мин

Maxim
26.10.2018
14:24:19
Я пробую все чт овы предлагаете, отпишусь, 5 мин
Моего достаточно будет, скорее всего

vladimir
26.10.2018
14:24:38
а свойство замените private ObservableCollection<ScopeOfHelp> serverTagsCollection; public ObservableCollection<ScopeOfHelp> ServerTagsCollection { get => serverTagsCollection; set {serverTagsCollection = value; OnPropertyChanged(nameof(ServerTagsCollection))} }

и уберите OnPropertyChanged из SetPanelTagsCollection

vladimir
26.10.2018
14:28:09
Зачем делать OnPropertyChanged ObservableCollection ?
чтобы привязанная View знала, что коллекция изменилась

Maxim
26.10.2018
14:29:05
чтобы привязанная View знала, что коллекция изменилась
ObservableCollection - реализует данный интерфейс, зачем по два раза свойство обновлять?

vladimir
26.10.2018
14:30:00
как при ServerTagsCollection = new ObservableCollection<ScopeOfHelp>(list) оно вызовет, что у него коллекция обновилась, если это будет новый объект?

vladimir
26.10.2018
14:31:01
чтобы не вызывать миллион раз изменение коллекции, а сделать это один раз, когда все данные будут готовы

vladimir
26.10.2018
14:33:00
его обычно используют, если данные будут добавляться впоследствии ещё, а если только один раз загружены, то он не нужен какой у человека сценарий, я не знаю, возможно, он планирует догружать данные

vladimir
26.10.2018
14:35:05
почему же? а что если впоследствии будут добавляться элементы по одному?

мы не будем полностью новые коллекции создавать

vladimir
26.10.2018
14:40:28
если мы объект коллекции заменим, об этом можно будет узнать только если соответствующую ей привязку уведомить

Google
vladimir
26.10.2018
14:40:58
Да все аналогично будет
не аналогично, List не будет уведомлять о новых детях

Maxim
26.10.2018
14:46:00
Dmitry
26.10.2018
14:49:05
vladimir
26.10.2018
14:49:14
покажите код

Dmitry
26.10.2018
14:49:32
сек

https://pastebin.com/hRqx4VBe

Kirill
26.10.2018
14:54:17
https://pastebin.com/hRqx4VBe
лучше прокинь во ViewModel метод OnAppearing и в нм создай таск, в котором await SetPanelTagsCollection(); OnBoardingInState = OnBoardingState.Normal; И как объявлено свойство OnBoardingInState ?

Kirill
26.10.2018
14:58:53
Dmitry
26.10.2018
14:59:07
public enum OnBoardingState { Loading, //Загрузка данных (индикатор загрузки по центру экрана) Normal, //Отображение данных Error, //Ошибка загрузки данных NoInternet, //Отсутствует интернет-соединение NoData //Нет данных }

public OnBoardingState OnBoardingInState { get => _onBoardingInState; set { _onBoardingInState = value; OnPropertyChanged(); } }

private OnBoardingState _onBoardingInState;

Kirill
26.10.2018
15:02:27
Как это реализовать? Прокинуть OnAppearing
на странице в методе OnAppearing вызвать созданный метод ViewModel.OnPageAppearing()

Dmitry
26.10.2018
15:03:32
public void OnPropertyChanged([CallerMemberName] string propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }

на странице в методе OnAppearing вызвать созданный метод ViewModel.OnPageAppearing()
Подвисает на Loading, на Normal не переходит, панель тегами не заполняется.

Dmitry
26.10.2018
15:08:54
Да

Кита
26.10.2018
15:09:32
а в каком потоке?)

Dmitry
26.10.2018
15:10:14
а в каком потоке?)
А как узнать??

Кита
26.10.2018
15:18:40
ну по коду посмотреть) ты используешь Task.Run(() =>SetPanelTagsCollection()); и ждешь что у тебя на UI что-то обновится

Страница 618 из 619