MvvmCross:我如何设置Spinner(MvxSpinner)的样式?

时间:2018-01-17 12:27:12

标签: android xamarin spinner mvvmcross mvxspinner

所以,问题很简单。如何为MvxSpinner应用样式。

关于设计一个普通的Spinner有很多答案,但大多数都引用了这行代码:

var adapter = new ArrayAdapter<string>(SupportActionBar.ThemedContext, Resource.Layout.event_selector, events);
  adapter.SetDropDownViewResource(global::Android.Resource.Layout.SimpleSpinnerDropDownItem);

_eventSelector.Adapter = adapter;

但是,我不知道如何处理MvxSpinner的情况。它可能使用一些特定于MvvmCross的适配器。我的约束如下:

 <Mvx.MvxSpinner
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/lstCategoryGroups"
    local:MvxBind="ItemsSource CategoryGroups; SelectedItem CategoryGroupdSelected"
     />

有什么想法吗? 两种方法:作为样式设置页面上的特定微调器元素,为任何微调器设置通用样式。谢谢!

1 个答案:

答案 0 :(得分:3)

您可以通过两个属性直接在axml中更改微调器的布局(因此也就是样式):

  • local:MvxItemTemplate:设置所选项目的布局。
  • local:MvxDropDownItemTemplate:设置下拉列表中每个项目的布局

给定一个带有集合CategoryGroupsSelectedCategoryGroup的ViewModel,即:

public class MyViewModel : MvxViewModel
{
    ...

    public ObservableCollection<CategoryGroup> CategoryGroups { get; set; }

    public CategoryGroup CategoryGroupdSelected { get; set; }

    ...
}

CategoryGroup类:

public class CategoryGroup
{
    public int Id { get; set; }

    public string Name { get; set; }
}

您可以将集合绑定到这样的微调器:

<MvxSpinner
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="2"
    android:theme="@style/Spinner"
    local:MvxItemTemplate="@layout/my_spinner_item"
    local:MvxDropDownItemTemplate="@layout/my_spinner_dropdown_item"
    local:MvxBind="ItemsSource CategoryGroups; SelectedItem CategoryGroupdSelected" />

并在每个模板中定义项目的布局/样式。考虑到模板中DataContext是一个项目(在本例中为CategoryGroup)。在我的示例中,我想显示每个Name的{​​{1}},然后我只需要CategoryGroup并将其TextView属性绑定到Text { {1}},即项目的Name

my_spinner_item.axml:

CategoryGroup

my_spinner_dropdown_item.axml:

DataContext

现在,如果您希望所有微调器具有相同的模板,您只需使用这些属性设置样式,或者您可以继承<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:local="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:textColor="@android:color/black" android:textSize="25sp" local:MvxBind="Text Name" /> 并以编程方式设置模板。

除此之外,如果你想使用每个模板中的一个而不是每个不同的绑定创建一个,你可以有一个基类<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:local="http://schemas.android.com/apk/res-auto" style="?android:attr/spinnerDropDownItemStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="8dp" android:paddingBottom="8dp" android:textColor="@android:color/black" android:alpha="0.8" local:MvxBind="Text Name" /> ,其中MvxSpinner属性名为BaseItemViewModel并使用要绑定在abstract中。因此,在您的VM中,您始终从Description继承并覆盖View属性以获得要显示的值。

BaseItemViewModel

另一种方法是让Description传递你想要在微调器中的对象public abstract class BaseItemViewModel : MvxNotifyPropertyChanged { public abstract string Description { get; } } 和一个WrappedItemViewModel,它返回微调器显示的内容(描述)和你有T属性只调用Func<T, string>。这种方式的优点是它不会使您始终从VM继承,并且您可以在其中包装几乎任何对象,从而添加要在Spinner中的行为。

Description