xamarin - 在 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
}
解决方案
Gender
必须是 中的一个元素GenderItems
。现在您正在创建一个新对象,它与中的项目具有相同的值GenderItems
,但它不是同一个对象
推荐阅读
- c# - IIS 上的 .Net 5.0 Web API 部署问题
- javascript - 如何一次从具有嵌套对象数组的多个文档中获取与来自 mongodoDb 的查询匹配的所有值
- asp.net - 为什么我应该在创建新的 ASP.NET 项目时禁用 https?
- node.js - JWT 认证失败
- javascript - Electron,如何使 100% 确定渲染器从主服务器接收消息?
- c# - 如何在 WPF 中的 ReactiveUI 中设置 ItemsSource 和源集合之间的双向绑定
- swift - UITextField 的 leftView 上的图像未呈现
- swagger - 无法解析 yaml 文件中 requestBody 中定义的参考组件架构
- python - 优化:根据日期将带有DatetimeIndex的pandas DataFrame拆分为列表
- javascript - 如何在 OnChangeText 中向我的组件 inputText 添加两个状态