Binding to MvxSpinner SelectedItem property not working
up vote
2
down vote
favorite
I use a MvxSpinner to show country phone prefixes in a combobox in a MvvmCross for Xamarin app. I can bind to the ItemsSource property correctly, so I can see the list of my prefixes but when I assign the property in my view model that is bind to the SelectedItem property of the MvxSpinner, it won't work and will always show the first element in the list as the selected item.
The way I do it is the following. In my ViewModel I get the user data from the server and assign the properties for Country and PhonePrefix. Then I get the list of all countries and prefixes also from server and bind them to the list properties that are binded to the ItemSource properties of the respewctive MvxSpinners (simplified):
public string PhonePrefix { get; set; }
public string PhoneNumber { get; set; }
public List<Country> Countries { get; set; } = new List<Country>();
public List<string> Prefixes { get; set; } = new List<string>();
private async Task GetUserData()
{
try
{
var userDataResult = await _registrationService.GetLoggedInUserData();
if (userDataResult != null)
{
if (!userDataResult.HTTPStatusCode.Equals(HttpStatusCode.OK))
{
Mvx.IoCProvider.Resolve<IUserDialogs>().Alert(userDataResult.Error?.Message);
}
else
{
PhonePrefix = userDataResult.user.country_code_phone;
PhoneNumber = userDataResult.user.phone;
}
}
}
catch (Exception e)
{
Log.Error<RegistrationViewModel>("GetUserData", e);
}
}
/// <summary>
/// Populates the view model properties for Countries and Prefixes with information retrieved from the server
/// </summary>
private void ProcessFormData()
{
if (_registrationFormData != null)
{
Countries = _registrationFormData.Countries?.ToList();
var userCountry = Countries?.Where(c => c.id == Country?.id).FirstOrDefault();
Country = IsUserLogedIn && Country != null ? userCountry : Countries?[0];
var prefixes = new List<string>();
if (Countries != null)
{
foreach (var country in Countries)
{
//spinner binding doesn't allow null values
if (country.phone_prefix != null)
{
prefixes.Add(country.phone_prefix);
}
}
}
//we need to assign the binded Prefixes at once otherwise the binding for the ItemSource fails
Prefixes = prefixes;
PhonePrefix = Prefixes.Count > 0 && !IsUserLogedIn && string.IsNullOrWhiteSpace(PhonePrefix) ? Prefixes?[0] : PhonePrefix;
}
}
And in the axml layout:
<MvxSpinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="10dp"
android:id="@+id/spnrCountry"
local:MvxBind="ItemsSource Countries; SelectedItem Country"/>
<MvxSpinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:layout_marginBottom="10dp"
android:id="@+id/spnrPrefix"
local:MvxBind="ItemsSource Prefixes; SelectedItem PhonePrefix"/>
On the output window I can see the following error regarding MvxBinding:
(MvxBind) Null values not permitted in spinner SelectedItem binding currently
I debugged and I never have any Null values in the lists or in the properties I bind to the ItemSource and SelectedItem properties of the MvxSpinner.
Actually the Countries ItemSource and SelectedItem work properly so if user saved it's country to be Argentina, when I load it's data the selected item in the spinner will be Argentina. Note that I use a Country entity like that:
public class Country
{
public int id { get; set; }
public bool favorite { get; set; }
public string name { get; set; }
public string name_de { get; set; }
public string code { get; set; }
public int rzl_code { get; set; }
public string phone_prefix { get; set; }
public string updated_at { get; set; }
public string created_at { get; set; }
public override string ToString()
{
return name;
}
}
I also tried to make the phone prefix in it's own entity wrapping a string value but it didn't work either.
Does anybody knows what I'm doing wrong? Why for the Countries it's working and for the prefixes not?
Thanks!
c# mvvmcross selecteditem mvxbind mvxspinner
add a comment |
up vote
2
down vote
favorite
I use a MvxSpinner to show country phone prefixes in a combobox in a MvvmCross for Xamarin app. I can bind to the ItemsSource property correctly, so I can see the list of my prefixes but when I assign the property in my view model that is bind to the SelectedItem property of the MvxSpinner, it won't work and will always show the first element in the list as the selected item.
The way I do it is the following. In my ViewModel I get the user data from the server and assign the properties for Country and PhonePrefix. Then I get the list of all countries and prefixes also from server and bind them to the list properties that are binded to the ItemSource properties of the respewctive MvxSpinners (simplified):
public string PhonePrefix { get; set; }
public string PhoneNumber { get; set; }
public List<Country> Countries { get; set; } = new List<Country>();
public List<string> Prefixes { get; set; } = new List<string>();
private async Task GetUserData()
{
try
{
var userDataResult = await _registrationService.GetLoggedInUserData();
if (userDataResult != null)
{
if (!userDataResult.HTTPStatusCode.Equals(HttpStatusCode.OK))
{
Mvx.IoCProvider.Resolve<IUserDialogs>().Alert(userDataResult.Error?.Message);
}
else
{
PhonePrefix = userDataResult.user.country_code_phone;
PhoneNumber = userDataResult.user.phone;
}
}
}
catch (Exception e)
{
Log.Error<RegistrationViewModel>("GetUserData", e);
}
}
/// <summary>
/// Populates the view model properties for Countries and Prefixes with information retrieved from the server
/// </summary>
private void ProcessFormData()
{
if (_registrationFormData != null)
{
Countries = _registrationFormData.Countries?.ToList();
var userCountry = Countries?.Where(c => c.id == Country?.id).FirstOrDefault();
Country = IsUserLogedIn && Country != null ? userCountry : Countries?[0];
var prefixes = new List<string>();
if (Countries != null)
{
foreach (var country in Countries)
{
//spinner binding doesn't allow null values
if (country.phone_prefix != null)
{
prefixes.Add(country.phone_prefix);
}
}
}
//we need to assign the binded Prefixes at once otherwise the binding for the ItemSource fails
Prefixes = prefixes;
PhonePrefix = Prefixes.Count > 0 && !IsUserLogedIn && string.IsNullOrWhiteSpace(PhonePrefix) ? Prefixes?[0] : PhonePrefix;
}
}
And in the axml layout:
<MvxSpinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="10dp"
android:id="@+id/spnrCountry"
local:MvxBind="ItemsSource Countries; SelectedItem Country"/>
<MvxSpinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:layout_marginBottom="10dp"
android:id="@+id/spnrPrefix"
local:MvxBind="ItemsSource Prefixes; SelectedItem PhonePrefix"/>
On the output window I can see the following error regarding MvxBinding:
(MvxBind) Null values not permitted in spinner SelectedItem binding currently
I debugged and I never have any Null values in the lists or in the properties I bind to the ItemSource and SelectedItem properties of the MvxSpinner.
Actually the Countries ItemSource and SelectedItem work properly so if user saved it's country to be Argentina, when I load it's data the selected item in the spinner will be Argentina. Note that I use a Country entity like that:
public class Country
{
public int id { get; set; }
public bool favorite { get; set; }
public string name { get; set; }
public string name_de { get; set; }
public string code { get; set; }
public int rzl_code { get; set; }
public string phone_prefix { get; set; }
public string updated_at { get; set; }
public string created_at { get; set; }
public override string ToString()
{
return name;
}
}
I also tried to make the phone prefix in it's own entity wrapping a string value but it didn't work either.
Does anybody knows what I'm doing wrong? Why for the Countries it's working and for the prefixes not?
Thanks!
c# mvvmcross selecteditem mvxbind mvxspinner
add a comment |
up vote
2
down vote
favorite
up vote
2
down vote
favorite
I use a MvxSpinner to show country phone prefixes in a combobox in a MvvmCross for Xamarin app. I can bind to the ItemsSource property correctly, so I can see the list of my prefixes but when I assign the property in my view model that is bind to the SelectedItem property of the MvxSpinner, it won't work and will always show the first element in the list as the selected item.
The way I do it is the following. In my ViewModel I get the user data from the server and assign the properties for Country and PhonePrefix. Then I get the list of all countries and prefixes also from server and bind them to the list properties that are binded to the ItemSource properties of the respewctive MvxSpinners (simplified):
public string PhonePrefix { get; set; }
public string PhoneNumber { get; set; }
public List<Country> Countries { get; set; } = new List<Country>();
public List<string> Prefixes { get; set; } = new List<string>();
private async Task GetUserData()
{
try
{
var userDataResult = await _registrationService.GetLoggedInUserData();
if (userDataResult != null)
{
if (!userDataResult.HTTPStatusCode.Equals(HttpStatusCode.OK))
{
Mvx.IoCProvider.Resolve<IUserDialogs>().Alert(userDataResult.Error?.Message);
}
else
{
PhonePrefix = userDataResult.user.country_code_phone;
PhoneNumber = userDataResult.user.phone;
}
}
}
catch (Exception e)
{
Log.Error<RegistrationViewModel>("GetUserData", e);
}
}
/// <summary>
/// Populates the view model properties for Countries and Prefixes with information retrieved from the server
/// </summary>
private void ProcessFormData()
{
if (_registrationFormData != null)
{
Countries = _registrationFormData.Countries?.ToList();
var userCountry = Countries?.Where(c => c.id == Country?.id).FirstOrDefault();
Country = IsUserLogedIn && Country != null ? userCountry : Countries?[0];
var prefixes = new List<string>();
if (Countries != null)
{
foreach (var country in Countries)
{
//spinner binding doesn't allow null values
if (country.phone_prefix != null)
{
prefixes.Add(country.phone_prefix);
}
}
}
//we need to assign the binded Prefixes at once otherwise the binding for the ItemSource fails
Prefixes = prefixes;
PhonePrefix = Prefixes.Count > 0 && !IsUserLogedIn && string.IsNullOrWhiteSpace(PhonePrefix) ? Prefixes?[0] : PhonePrefix;
}
}
And in the axml layout:
<MvxSpinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="10dp"
android:id="@+id/spnrCountry"
local:MvxBind="ItemsSource Countries; SelectedItem Country"/>
<MvxSpinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:layout_marginBottom="10dp"
android:id="@+id/spnrPrefix"
local:MvxBind="ItemsSource Prefixes; SelectedItem PhonePrefix"/>
On the output window I can see the following error regarding MvxBinding:
(MvxBind) Null values not permitted in spinner SelectedItem binding currently
I debugged and I never have any Null values in the lists or in the properties I bind to the ItemSource and SelectedItem properties of the MvxSpinner.
Actually the Countries ItemSource and SelectedItem work properly so if user saved it's country to be Argentina, when I load it's data the selected item in the spinner will be Argentina. Note that I use a Country entity like that:
public class Country
{
public int id { get; set; }
public bool favorite { get; set; }
public string name { get; set; }
public string name_de { get; set; }
public string code { get; set; }
public int rzl_code { get; set; }
public string phone_prefix { get; set; }
public string updated_at { get; set; }
public string created_at { get; set; }
public override string ToString()
{
return name;
}
}
I also tried to make the phone prefix in it's own entity wrapping a string value but it didn't work either.
Does anybody knows what I'm doing wrong? Why for the Countries it's working and for the prefixes not?
Thanks!
c# mvvmcross selecteditem mvxbind mvxspinner
I use a MvxSpinner to show country phone prefixes in a combobox in a MvvmCross for Xamarin app. I can bind to the ItemsSource property correctly, so I can see the list of my prefixes but when I assign the property in my view model that is bind to the SelectedItem property of the MvxSpinner, it won't work and will always show the first element in the list as the selected item.
The way I do it is the following. In my ViewModel I get the user data from the server and assign the properties for Country and PhonePrefix. Then I get the list of all countries and prefixes also from server and bind them to the list properties that are binded to the ItemSource properties of the respewctive MvxSpinners (simplified):
public string PhonePrefix { get; set; }
public string PhoneNumber { get; set; }
public List<Country> Countries { get; set; } = new List<Country>();
public List<string> Prefixes { get; set; } = new List<string>();
private async Task GetUserData()
{
try
{
var userDataResult = await _registrationService.GetLoggedInUserData();
if (userDataResult != null)
{
if (!userDataResult.HTTPStatusCode.Equals(HttpStatusCode.OK))
{
Mvx.IoCProvider.Resolve<IUserDialogs>().Alert(userDataResult.Error?.Message);
}
else
{
PhonePrefix = userDataResult.user.country_code_phone;
PhoneNumber = userDataResult.user.phone;
}
}
}
catch (Exception e)
{
Log.Error<RegistrationViewModel>("GetUserData", e);
}
}
/// <summary>
/// Populates the view model properties for Countries and Prefixes with information retrieved from the server
/// </summary>
private void ProcessFormData()
{
if (_registrationFormData != null)
{
Countries = _registrationFormData.Countries?.ToList();
var userCountry = Countries?.Where(c => c.id == Country?.id).FirstOrDefault();
Country = IsUserLogedIn && Country != null ? userCountry : Countries?[0];
var prefixes = new List<string>();
if (Countries != null)
{
foreach (var country in Countries)
{
//spinner binding doesn't allow null values
if (country.phone_prefix != null)
{
prefixes.Add(country.phone_prefix);
}
}
}
//we need to assign the binded Prefixes at once otherwise the binding for the ItemSource fails
Prefixes = prefixes;
PhonePrefix = Prefixes.Count > 0 && !IsUserLogedIn && string.IsNullOrWhiteSpace(PhonePrefix) ? Prefixes?[0] : PhonePrefix;
}
}
And in the axml layout:
<MvxSpinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="10dp"
android:id="@+id/spnrCountry"
local:MvxBind="ItemsSource Countries; SelectedItem Country"/>
<MvxSpinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:layout_marginBottom="10dp"
android:id="@+id/spnrPrefix"
local:MvxBind="ItemsSource Prefixes; SelectedItem PhonePrefix"/>
On the output window I can see the following error regarding MvxBinding:
(MvxBind) Null values not permitted in spinner SelectedItem binding currently
I debugged and I never have any Null values in the lists or in the properties I bind to the ItemSource and SelectedItem properties of the MvxSpinner.
Actually the Countries ItemSource and SelectedItem work properly so if user saved it's country to be Argentina, when I load it's data the selected item in the spinner will be Argentina. Note that I use a Country entity like that:
public class Country
{
public int id { get; set; }
public bool favorite { get; set; }
public string name { get; set; }
public string name_de { get; set; }
public string code { get; set; }
public int rzl_code { get; set; }
public string phone_prefix { get; set; }
public string updated_at { get; set; }
public string created_at { get; set; }
public override string ToString()
{
return name;
}
}
I also tried to make the phone prefix in it's own entity wrapping a string value but it didn't work either.
Does anybody knows what I'm doing wrong? Why for the Countries it's working and for the prefixes not?
Thanks!
c# mvvmcross selecteditem mvxbind mvxspinner
c# mvvmcross selecteditem mvxbind mvxspinner
edited yesterday
D Manokhin
590118
590118
asked yesterday
jcasas
578
578
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
up vote
0
down vote
It does work, as PhonePrefix is set in GetUserData, also you should set Country. From your code Country is null, this is why you are getting the first item from the list selected or error also.
add a comment |
up vote
0
down vote
The error you are getting about null
is because SelectedItem
in the spinner does not allow null
as a selected item. So if you want to display an empty item one solution is to add another fixed item that has an empty value, i.e. in the case of PhonePrefix
you can set string.Empty
and add it to the list of PhonePrefixes
and in your Country
you can set the first one as default or create a stub Country
with name None
for example and add it to the list of countries.
Another point to take into account is that when you want to update the view you have to be sure that you are notifying it in the Main Thread. You are trying to update the PhonePrefix
in a Task
of another thread so the view does not get noticed.
You should update PhonePrefix
by doing:
this.InvokeOnMainThread(() => PhonePrefix = userDataResult.user.country_code_phone;
);
This will take care of doing the set of PhonePrefix
directly on the Main thread so your view will be notified correctly.
HIH
add a comment |
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
It does work, as PhonePrefix is set in GetUserData, also you should set Country. From your code Country is null, this is why you are getting the first item from the list selected or error also.
add a comment |
up vote
0
down vote
It does work, as PhonePrefix is set in GetUserData, also you should set Country. From your code Country is null, this is why you are getting the first item from the list selected or error also.
add a comment |
up vote
0
down vote
up vote
0
down vote
It does work, as PhonePrefix is set in GetUserData, also you should set Country. From your code Country is null, this is why you are getting the first item from the list selected or error also.
It does work, as PhonePrefix is set in GetUserData, also you should set Country. From your code Country is null, this is why you are getting the first item from the list selected or error also.
edited yesterday
answered yesterday
Nicolae
213
213
add a comment |
add a comment |
up vote
0
down vote
The error you are getting about null
is because SelectedItem
in the spinner does not allow null
as a selected item. So if you want to display an empty item one solution is to add another fixed item that has an empty value, i.e. in the case of PhonePrefix
you can set string.Empty
and add it to the list of PhonePrefixes
and in your Country
you can set the first one as default or create a stub Country
with name None
for example and add it to the list of countries.
Another point to take into account is that when you want to update the view you have to be sure that you are notifying it in the Main Thread. You are trying to update the PhonePrefix
in a Task
of another thread so the view does not get noticed.
You should update PhonePrefix
by doing:
this.InvokeOnMainThread(() => PhonePrefix = userDataResult.user.country_code_phone;
);
This will take care of doing the set of PhonePrefix
directly on the Main thread so your view will be notified correctly.
HIH
add a comment |
up vote
0
down vote
The error you are getting about null
is because SelectedItem
in the spinner does not allow null
as a selected item. So if you want to display an empty item one solution is to add another fixed item that has an empty value, i.e. in the case of PhonePrefix
you can set string.Empty
and add it to the list of PhonePrefixes
and in your Country
you can set the first one as default or create a stub Country
with name None
for example and add it to the list of countries.
Another point to take into account is that when you want to update the view you have to be sure that you are notifying it in the Main Thread. You are trying to update the PhonePrefix
in a Task
of another thread so the view does not get noticed.
You should update PhonePrefix
by doing:
this.InvokeOnMainThread(() => PhonePrefix = userDataResult.user.country_code_phone;
);
This will take care of doing the set of PhonePrefix
directly on the Main thread so your view will be notified correctly.
HIH
add a comment |
up vote
0
down vote
up vote
0
down vote
The error you are getting about null
is because SelectedItem
in the spinner does not allow null
as a selected item. So if you want to display an empty item one solution is to add another fixed item that has an empty value, i.e. in the case of PhonePrefix
you can set string.Empty
and add it to the list of PhonePrefixes
and in your Country
you can set the first one as default or create a stub Country
with name None
for example and add it to the list of countries.
Another point to take into account is that when you want to update the view you have to be sure that you are notifying it in the Main Thread. You are trying to update the PhonePrefix
in a Task
of another thread so the view does not get noticed.
You should update PhonePrefix
by doing:
this.InvokeOnMainThread(() => PhonePrefix = userDataResult.user.country_code_phone;
);
This will take care of doing the set of PhonePrefix
directly on the Main thread so your view will be notified correctly.
HIH
The error you are getting about null
is because SelectedItem
in the spinner does not allow null
as a selected item. So if you want to display an empty item one solution is to add another fixed item that has an empty value, i.e. in the case of PhonePrefix
you can set string.Empty
and add it to the list of PhonePrefixes
and in your Country
you can set the first one as default or create a stub Country
with name None
for example and add it to the list of countries.
Another point to take into account is that when you want to update the view you have to be sure that you are notifying it in the Main Thread. You are trying to update the PhonePrefix
in a Task
of another thread so the view does not get noticed.
You should update PhonePrefix
by doing:
this.InvokeOnMainThread(() => PhonePrefix = userDataResult.user.country_code_phone;
);
This will take care of doing the set of PhonePrefix
directly on the Main thread so your view will be notified correctly.
HIH
answered yesterday
fmaccaroni
2,0951723
2,0951723
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53408601%2fbinding-to-mvxspinner-selecteditem-property-not-working%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown