es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Establecer el SelectedItem de un picker en Xamarin Forms MVVM a un valor.

Soy nuevo en Xamarin.Forms y MVVM. Tengo el siguiente picker en XAML:

<picker title="Estado Civil" x:name="maritalStatus" margin="10,5,10,0" itemssource="{Binding MaritalStatusList}" itemdisplaybinding="{Binding Value}" selecteditem="{Binding SelectedMaritalStatus, Mode=TwoWay}">
</picker>

Así es como configuro la lista de elementos:

public class KeyValuePair
{
    public int Key { get; set; }
    public string Value { get; set; }
}

public static class MaritalStatus
{
    public static List<keyvaluepair> GetMaritalStatus()
    {
        return new List<keyvaluepair>()
        {
            new KeyValuePair() {Key=1, Value="Soltero(a)"},
            new KeyValuePair() {Key=1, Value="Casado(a)"},
            new KeyValuePair() {Key=1, Value="Viudo(a)"},
            new KeyValuePair() {Key=1, Value="Divorciado(a)"},
            new KeyValuePair() {Key=1, Value="Pareja de hecho"}

        };
    }
}

Y así es como configuro la propiedad:

KeyValuePair selectedMaritalStatus;
public KeyValuePair SelectedMaritalStatus
{
    get => selectedMaritalStatus;
    set
    {
        SetProperty(ref selectedMaritalStatus, value);
        MaritalStatusText = selectedMaritalStatus.Value;
    }
}

string maritalStatusText;
public string MaritalStatusText
{
    get => maritalStatusText;
    set
    {
        SetProperty(ref maritalStatusText, value);
    }
}

Lo anterior muestra correctamente la lista en el picker. Mi problema es que tengo un formulario y quiero establecer el picker con el valor que proviene de una base de datos. Tengo algunas otras entradas que puedo configurar correctamente desde un ViewModel de esta forma:

foreach (EmployeeDetails details in EmployeeDetailsService.EmployeeDetails)
{
    Id = details.Id;
    ADEmployeeID = await new MSGraphService().GetUserIdAsync();
    FirstName = details.FirstName;
    MiddleName = details.MiddleName;
    LastName = details.LastName;
    Street = details.Address.Street;
    Block = details.Address.Block;
    City = details.Address.City;
    County = details.Address.County;
    PostCode = details.Address.PostCode;
    Telephone = details.Telephone;
    DateOfBirth = details.DateOfBirth != null ? DateTime.Parse(details.DateOfBirth) : DateTime.Now.Date;
    CountryOfBirth = details.CountryOfBirth;
    SelectedMaritalStatus.Value = details.MaritalStatus;
    //MaritalStatusText = details.MaritalStatus;
    PassportIssuingCountry = details.PassportIssuingCountry;
    PassportNumber = details.PassportNumber;
    PassportExpiryDate = details.PassportExpiryDate != null ? DateTime.Parse(details.PassportExpiryDate) : DateTime.Now.Date;
    BankName = details.BankName;
    BankAddress = details.BankAddress;
    BankSortCode = details.BankSortCode;
    NationalInsuranceNumber = details.NationalInsuranceNumber;
    //    //! Need to add P45
}

El picker de estado civil es el único que no puedo configurar, todo lo demás funciona.

  • ACTUALIZACIÓN *

Este es mi SetProperty:

protected bool SetProperty<t>(ref T backingStore, T value,
        [CallerMemberName] string propertyName = "",
        Action onChanged = null)
    {
        if (EqualityComparer<t>.Default.Equals(backingStore, value)) { return false; }

        backingStore = value;
        onChanged?.Invoke();
        OnPropertyChanged(propertyName);
        return true;
    }

    #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChangedEventHandler changed = PropertyChanged;
        if (changed == null) { return; }

        changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

Cualquier ayuda sería muy apreciada.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para configurar el selector con un valor proveniente de una base de datos, necesitas encontrar el KeyValuePair correspondiente en la lista ItemsSource y establecerlo como el SelectedItem. Puedes hacer esto en el ViewModel de esta manera:

    foreach(KeyValuePair item in MaritalStatus.GetMaritalStatus())
    {
        if(item.Value == details.MaritalStatus)
        {
            SelectedMaritalStatus = item;
            break;
        }
    }
    

    Este código itera a través de MaritalStatusList y verifica si la propiedad Value de cada KeyValuePair es igual al valor de MaritalStatus proveniente de la base de datos. Si encuentra una coincidencia, establece la propiedad SelectedMaritalStatus en ese KeyValuePair y sale del bucle.

    Asegúrate de que el evento PropertyChanged se genere en el Setter de la propiedad SelectedMaritalStatus para que el selector actualice su visualización cuando se establece la propiedad.

    KeyValuePair selectedMaritalStatus;
    public KeyValuePair SelectedMaritalStatus
    {
        get => selectedMaritalStatus;
        set
        {
            SetProperty(ref selectedMaritalStatus, value);
            MaritalStatusText = selectedMaritalStatus.Value;
            OnPropertyChanged(nameof(SelectedMaritalStatus));
        }
    }
    

Comments are closed.