【问题标题】:MvxSpinner Initial ValueMvxSpinner 初始值
【发布时间】:2016-04-01 14:58:21
【问题描述】:

我在 Android 中有一个 MvvmCross MvxSpinner 绑定。用户选择一个值并反映在我的属性MealTypeSelected 中。

<MvxSpinner
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    local:MvxBind="ItemsSource MealTypeList;SelectedItem MealTypeSelected, Mode=TwoWay" />

微调器允许用户选择膳食类型(早餐、午餐、晚餐等)。餐食类型由一个名为MealType 的枚举表示。

public enum MealType {Unspecified, Breakfast, Lunch, Dinner, Snack};

我想通过将微调器初始化为一个基于显示ViewModel 的时间的值来使用户更轻松。所以如果页面是在中午加载的,我猜想选择应该是“午餐”。

问题是,我尝试在生命周期的不同位置设置ViewModel 中的MealTypeSelected 属性:构造函数、InitStart。但无论我做什么,当视图加载时,它会将选择 back 更改为枚举的默认值,即值“未指定”。

有没有办法解决此问题并将MvxSpinner 初始化为特定值?

【问题讨论】:

  • 据我回忆,微调器自动选择其 ItemsSource 中的初始值。您可以为 Spinner 初始化 ItemsSource,使第一个索引成为一天中特定时间的特定 MealType。
  • 这有效,但现在我的微调器列表是“午餐,未指定,早餐,午餐,晚餐,小吃”,当用户点击它时。我想我可以做一些自定义布局来澄清,但这并不理想。

标签: xamarin xamarin.android mvvmcross android-spinner


【解决方案1】:

尝试将此添加到您的“Setup.cs”文件中。我也有同样的挣扎,这对我有用。不记得我第一次在哪里找到解决方案。

    protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
    {
        MvxAppCompatSetupHelper.FillTargetFactories(registry);
        base.FillTargetFactories(registry);
    }

【讨论】:

  • 我过去也遇到过这个问题,但幸运的是我的 Setup.cs 中已经有这个问题。除非您有绑定,否则绑定根本不起作用。就我而言,绑定正在工作,但我无法将初始选择设置为 List 的第一个值以外的任何值。
  • 您可以尝试使用视图模型中的属性更新问题吗?
【解决方案2】:

我在将 MvxSpinner 的 SelectedItem 绑定到我的 ViewModel 时遇到了类似的问题,同时也在 ViewModel 中设置它。

覆盖我绑定到的类型的Equals 解决了这个问题。

public override bool Equals(object obj)
{
    return this.Id == (obj as MyType)?.Id;
}

由于您似乎直接绑定到一个枚举,您可能不得不尝试将它包装在另一个对象中。

【讨论】:

  • 这是真正的答案。重新排序列表是一种解决方法。
【解决方案3】:

Stack Overflow 不会让我接受 pnavk 的评论作为答案,但这是我最终要做的。每次用户选择某些东西时,我都会将列表中的第一项更改为选择的内容。一个丑陋的解决方案,但它奏效了。如果其他人无法接受,那么您可能需要进行一些自定义绑定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    相关资源
    最近更新 更多