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 的相等性检查。我的假设是,即使 ValueName 的值相同,对象也不会被视为相等(如果它们是对象,则应该如此),因此选择器可能无法从列表中选择正确的对象。不过不确定,只是一个想法:-) 你是对的,我假设是因为SelectedItem,是来自数据源的一个项目,你必须使用整个selectedItem来做比较。但看起来只看值:SelectedIndex="Binding SelectedFeedbackType.Value" 就可以了。 嗯,这似乎有点绕道。我相信这只会起作用,因为默认情况下枚举数的值从 0 开始(因此它们与索引映射)。但是一旦有人在哪里调整你的枚举值,你的这部分代码可能会中断,这使得它太脆弱了 imo。但是我没有时间测试这个 atm 所以这纯粹是理论上的。 我知道,值永远不会改变,但是直到 Xamarin 有一个很好的方法来绑定枚举列表(使用它们的显示属性作为显示名称),这是我让它工作的唯一方法在最新版本的 Xamarin 中,使用 .net 标准。 我认为问题不在于enum,而更多在于ValueName 类。我想我会选择在 SelectedFeedbackType 的设置器中执行 _selectedFeedbackType = FeedBackTypes.FirstOrDefault(fbt =&gt; 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 选择器,未设置默认值的主要内容,如果未能解决你的问题,请参考以下文章

VUEJS根据api响应属性值设置选择默认值(显示未定义)

如何将今天设置为我的日期选择器默认值?

Autodesk Forge 查看器将选择颜色设置为默认值

设置包中的默认值未在 Xamarin.iOS 中加载

ASP.NET MVC DropdownList 设置默认值时未选择任何内容

如何在Xamarin的媒体插件中将闪存设置为默认值?