#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
)