首页 > 解决方案 > 在 Xamarin 的 ViewModel 中设置 Picker 的初始值

问题描述

在我的 Xamarin 应用程序中,我向页面添加了一个 Picker 控件。该 Picker 的设置如下所示xaml

<controls:ExtendedPicker x:Name="GenderPicker" Style="{StaticResource PickerControl}" Margin="0,0,0,20"
     ItemsSource="{Binding GenderItems}" 
     ItemDisplayBinding="{Binding Name}" 
     SelectedItem="{Binding Gender, Mode=TwoWay}" />

在我的 ViewModel 中,我有这段代码用一些值填充选择器:

public class GenderItem
{
    public string Name { get; set; }
}

public class RegisterViewModel : BaseViewModel
{
    private DateTime _birthdate;
    public DateTime Birthdate { get => _birthdate; set => SetProperty(ref _birthdate, value); }

    public GenderItem Gender { get => _gender; set => SetProperty(ref _gender, value); }
    public List<GenderItem> GenderItems { get; set; } = new List<GenderItem>
    {
        new GenderItem { Naam = "Male" },
        new GenderItem { Naam = "Female" },
        new GenderItem { Naam = "Confused" }
    };

    public RegisterViewModel()
    {
        // This doesn't work
        Gender = new GenderItem { Naam = "Female" };

        // This works
        Birthdate = DateTime.Today.AddYears(-40);
    }
}

从内部constructor我尝试为Picker控件设置默认选择值。但由于某种原因,该值未在Picker.

我还设置了一个datetime带有值的属性,我确实看到这个值是由 Date 控件获取的。

为什么这对Picker控件不起作用?我能做些什么来完成这项工作?


设置属性方法

SetProperty方法存在于我的BaseViewModel班级中。每个新的 Xamarin 项目都可以使用它。

    public class BaseViewModel : INotifyPropertyChanged
    {
        public IDataStore<Item> DataStore => DependencyService.Get<IDataStore<Item>>();

        bool _isBusy = false;
        public bool IsBusy
        {
            get => _isBusy;
            set => SetProperty(ref _isBusy, value);
        }

        string _title = string.Empty;
        public string Title
        {
            get => _title;
            set => SetProperty(ref _title, value);
        }

        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 = "")
        {
            var changed = PropertyChanged;
            if (changed == null)
                return;

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

标签: xamarinxamarin.forms

解决方案


Gender必须是 中的一个元素GenderItems。现在您正在创建一个新对象,它与中的项目具有相同的值GenderItems,但它不是同一个对象


推荐阅读