所以,问题很简单。如何为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"
/>
有什么想法吗? 两种方法:作为样式设置页面上的特定微调器元素,为任何微调器设置通用样式。谢谢!
答案 0 :(得分:3)
您可以通过两个属性直接在axml中更改微调器的布局(因此也就是样式):
local:MvxItemTemplate
:设置所选项目的布局。local:MvxDropDownItemTemplate
:设置下拉列表中每个项目的布局给定一个带有集合CategoryGroups
和SelectedCategoryGroup
的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