Xamarin 选择器,未设置默认值
Posted
技术标签:
【中文标题】Xamarin 选择器,未设置默认值【英文标题】:Xamarin picker, not setting default value 【发布时间】:2019-02-13 15:09:53 【问题描述】:我在屏幕上有一个选择器,它有一个初始值,以及更改选择器中项目的选项。
虽然我的 selectedItem 已设置,但我在屏幕上的选择器上看不到它,选择器没有设置值,直到我选择一个值,它才会在屏幕上的选择器中实际显示某些内容(此时 SelectedItem 也更新为新值)。
我的xml:
<Picker
ItemsSource="Binding FeedbackTypes"
SelectedItem="Binding SelectedFeedbackType, Mode=TwoWay"
ItemDisplayBinding="Binding Name">
</Picker>
我的 ViewModel 属性:
private ValueName _selectedFeedbackType;
public ValueName SelectedFeedbackType
get return _selectedFeedbackType;
set
_selectedFeedbackType = value;
OnPropertyChanged(nameof(SelectedFeedbackType));
public ObservableCollection<ValueName> FeedbackTypes
get
var feedbackTypes = new ObservableCollection<ValueName>();
foreach (FeedbackType feedback in
Enum.GetValues(typeof(FeedbackType)))
feedbackTypes.Add(new ValueName
Value = feedback,
Name = feedback.ToName()
);
return feedbackTypes;
在我的 ViewModel 构造函数中,我得到了:
SelectedFeedbackType = new ValueName Value = feedbackType, Name = feedbackType.ToName() ;
构造函数正确设置了 SelectedFeedbackType,如果我不对选择器进行任何更改,这就是我在提交时获得的值,但是,默认情况下我在选择器中看不到该值。选择器是空的,直到做出选择。
我还尝试将 SelectedIndex 值绑定到 SelectedFeedbackType,但是在选择器中也不会显示最初选择的值。
【问题讨论】:
我不完全确定所选项目是否需要出现在项目列表中,但我怀疑确实如此。那么问题是你如何实现ValueName
的相等性检查。我的假设是,即使 Value
和 Name
的值相同,对象也不会被视为相等(如果它们是对象,则应该如此),因此选择器可能无法从列表中选择正确的对象。不过不确定,只是一个想法:-)
你是对的,我假设是因为SelectedItem,是来自数据源的一个项目,你必须使用整个selectedItem来做比较。但看起来只看值:SelectedIndex="Binding SelectedFeedbackType.Value" 就可以了。
嗯,这似乎有点绕道。我相信这只会起作用,因为默认情况下枚举数的值从 0 开始(因此它们与索引映射)。但是一旦有人在哪里调整你的枚举值,你的这部分代码可能会中断,这使得它太脆弱了 imo。但是我没有时间测试这个 atm 所以这纯粹是理论上的。
我知道,值永远不会改变,但是直到 Xamarin 有一个很好的方法来绑定枚举列表(使用它们的显示属性作为显示名称),这是我让它工作的唯一方法在最新版本的 Xamarin 中,使用 .net 标准。
我认为问题不在于enum
,而更多在于ValueName
类。我想我会选择在 SelectedFeedbackType
的设置器中执行 _selectedFeedbackType = FeedBackTypes.FirstOrDefault(fbt => fbt.Value == value?.Value);
的解决方案,或者,可能是更好的解决方案,在 ValueName 类上实现 IEquatable
接口。
【参考方案1】:
您可以尝试设置 Xamarin Picker
的默认值。
您只需像以下代码一样设置选择器的 selectedIndex(索引的第一个数字为 0)。
Mypicker.SelectedIndex=1;
有demo的代码。
第一次运行时演示的 GIF。
您可以通过链接下载此演示。 https://developer.xamarin.com/samples/xamarin-forms/UserInterface/PickerDemo/
然后改了MonkeysPage.xaml
的代码。
<Picker x:Name="Mypicker" Title="Baboon" ItemsSource="Binding Monkeys" ItemDisplayBinding="Binding Name" SelectedItem="Binding SelectedMonkey" />
在MonkeysPage.xaml.cs
中添加Picker
的默认值。
public MonkeysPage()
InitializeComponent();
BindingContext = new MonkeysPageViewModel();
Mypicker.SelectedIndex=1;
【讨论】:
我之前尝试过使用该演示,但是,就我而言,它没有用。我的列表是枚举列表,枚举有一个显示属性,即值的名称。另外我的 selectedIndex 取决于您在它之前的屏幕上选择的内容,因此它的值永远不会相同。以上是关于Xamarin 选择器,未设置默认值的主要内容,如果未能解决你的问题,请参考以下文章