【发布时间】: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