Ошибка, которую вы получаете около null
, заключается в том, что SelectedItem
в счетчике не допускает null
в качестве выбранного элемента.Поэтому, если вы хотите отобразить пустой элемент, одним из решений является добавление еще одного фиксированного элемента с пустым значением, то есть в случае PhonePrefix
вы можете установить string.Empty
и добавить его в список PhonePrefixes
и в вашCountry
вы можете установить первый по умолчанию или создать, например, заглушку Country
с именем None
и добавить ее в список стран.
Еще один момент, который необходимо учитывать, - это когда выЧтобы обновить представление, вы должны быть уверены, что уведомляете его в Главной теме.Вы пытаетесь обновить PhonePrefix
в Task
другого потока, чтобы представление не было замечено.
Вам необходимо обновить PhonePrefix
, выполнив:
this.InvokeOnMainThread(() => PhonePrefix = userDataResult.user.country_code_phone;
);
Это обеспечит выполнение набора PhonePrefix
непосредственно в главном потоке, чтобы ваше представление было правильно уведомлено.
Обновление
После того, как вы лучше рассмотрите свой вопрос и свой собственный ответ и увидите, что вы используете PropertyChanged.Fody
, я могу догадаться, что проблема была в том, как вы назначаете поведение PhonePrefix
.
PropertyChanged.Fody
по умолчанию длядобавьте Проверка на равенство , которая заменяет код вашей собственности
public string PhonePrefix { get; set; }
на что-то вроде
private string _phonePrefix;
public string PhonePrefix
{
get
{
return _phonePrefix;
}
set
{
if (!String.Equals(_phonePrefix, value))
{
_phonePrefix = value;
OnPropertyChanged("PhonePrefix");
}
}
}
, поэтому, когда вы делаете в GetUserData()
:
PhonePrefix = userDataResult.user.country_code_phone;
и в ProcessFormData()
PhonePrefix = Prefixes.Count > 0 && !IsUserLogedIn && string.IsNullOrWhiteSpace(PhonePrefix) ? Prefixes?[0] : PhonePrefix;
PhonePrefix
не является нулем или пробелом, поэтому он пытается переназначить одно и то же значение, но поскольку fody добавляет проверку на равенство, ему не назначается снова, и поэтомуэто не вызывает изменения значения, поэтому представление не получает уведомления.
Назначение в GetUserData()
Я думаю, что это может быть сделано в другом потоке, и поэтому представление не получает уведомления.Согласно тому, что вы сказали, Country
действительно обновляется в ProcessFormData()
, поэтому для того, чтобы PhonePrefix
тоже обновлялся в этом месте, вам нужно только добавить атрибут [DoNotCheckEquality]
к свойству, чтобы избежать проверки на равенство, и это должно бытьвсе.
[DoNotCheckEquality]
public string PhonePrefix { get; set; }
Если это не работает, вы должны добавить вызов также в основном потоке (я советую вам посмотреть в отладке, в каком потоке выполняется метод, чтобы узнать, нужен ли вам вызов в основном потоке).нить).
HIH