【问题标题】:Set initial value for Picker in ViewModel in Xamarin在 Xamarin 的 ViewModel 中设置 Picker 的初始值
【发布时间】:2021-05-03 14:05:53
【问题描述】:

在我的 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 方法

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
    }

【问题讨论】:

  • Gender 必须是GenderItems 中的一个元素。现在您正在创建一个新对象,它与GenderItems 中的项目具有相同的值,但它不是同一个对象
  • @Jason 谢谢,就是这样。您可以将此作为答案发布,以便我接受吗?

标签: xamarin xamarin.forms


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    相关资源
    最近更新 更多