Xamarin Forms MVVM устанавливает для выбранного элемента выбора значение

#xamarin.forms #mvvm #picker

#xamarin.формы #mvvm #подборщик

Вопрос:

Я новичок в Xamarin.Формы и MVVM. У меня есть следующий выбор в XAML:

 lt;Picker Title="Marital Status"  x:Name="maritalStatus"  Margin="10,5,10,0"  ItemsSource="{Binding MaritalStatusList}"  ItemDisplayBinding="{Binding Value}"   SelectedItem="{Binding SelectedMaritalStatus, Mode=TwoWay}"gt;  lt;/Pickergt;  

Вот как я настраиваю источник элемента:

 public class KeyValuePair {  public int Key { get; set; }  public string Value { get; set; } }  public static class MaritalStatus {  public static Listlt;KeyValuePairgt; GetMaritalStatus()  {  return new Listlt;KeyValuePairgt;()  {  new KeyValuePair() {Key=1, Value="Single"},  new KeyValuePair() {Key=1, Value="Married"},  new KeyValuePair() {Key=1, Value="Widowed"},  new KeyValuePair() {Key=1, Value="Divorced"},  new KeyValuePair() {Key=1, Value="Civil Partnership"}   };  } }  

И вот как я устанавливаю свойство:

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

Вышеизложенное правильно отображает список в окне выбора. Моя проблема в том, что у меня есть форма, и я хочу установить для средства выбора значение, полученное из базы данных. У меня есть несколько других записей, которые я могу успешно установить из модели представления, например:

 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  }  

Выбор семейного положения-единственный, который я не могу установить, все остальное работает.

*** ОБНОВЛЕНИЕ ***

Это моя сетевая собственность:

 protected bool SetPropertylt;Tgt;(ref T backingStore, T value,  [CallerMemberName] string propertyName = "",  Action onChanged = null)  {  if (EqualityComparerlt;Tgt;.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));  }  

Любая помощь была бы очень признательна.

Комментарии:

1. вам нужно найти значение в базе MaritalStatusList данных и установить SelectedMaritalStatus это значение. SelectedItem должно быть, это одна из ценностей в ItemsSource

2. Привет, Джейсон. Спасибо за ваш быстрый ответ. Я изменил свой код следующим образом: SelectedMaritalStatus = new KeyValuePair() { Ключ = 1, Значение = подробности. MaritalStatus }; Теперь я вижу, что набор вызван и значение установлено правильно, но пользовательский интерфейс не обновляется с новым значением. Есть идеи, почему?

3. поскольку вы устанавливаете SelectedMaritalStatus новый экземпляр , а не один из экземпляров, которые уже существуют в MaritalStatusList

4. Привет, Джейсон. Не могли бы вы привести мне пример, основанный на структуре кода, которая у меня есть? Спасибо.

Ответ №1:

SelectedMaritalStatus должен быть одним из объектов в MaritalStatusList

 SelectedMaritalStatus = MaritalStatusList[0];  

или

 SelectedMaritalStatus = MaritalStatusList.First(x =gt; x.ID == "some value from your db");  

Комментарии:

1. Большое тебе спасибо, Джейсон. Это решило мою проблему.

Ответ №2:

Вы можете попытаться установить значение по умолчанию для Xamarin Picker . Вы просто устанавливаете selectedIndex (первое число индекса равно 0) вашего средства выбора yourpage.xaml.cs следующим образом:

 maritalStatus.SelectedIndex=1;  

Весь код является:

 public partial class MainPage : ContentPage {  public MainPage()  {  InitializeComponent();   maritalStatus.SelectedIndex = 1;  }  // other code }  

Примечание:

Я предлагаю вам переименовать ваш выбор, чтобы лучше идентифицировать ваш выбор(например mStatusPicker )