gpt4 book ai didi

mvvmcross:如何使用枚举值作为 ItemsSource

转载 作者:行者123 更新时间:2023-12-03 08:05:26 26 4
gpt4 key购买 nike

我的模型中有以下内容:

public class Equipment
{
public enum Type
{
Detector,
VegetationClearance,
Removal,
Engaging
}
}

在 View 模型中:
    private Equipment.Type _equipmentType;
public Equipment.Type EquipmentType
{
get { return _equipmentType; }
set
{
_equipmentType = value;
RaisePropertyChanged(() => EquipmentType);
}
}

我想将这些值用作 ItemsSource 以便用户可以从枚举中进行选择:
    <Mvx.MvxSpinner
android:id="@+id/type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
local:MvxBind="ItemsSource Equipment.Type; SelectedItem TypeSelection" />

这根本行不通。有没有办法将枚举绑定(bind)为 ItemsSource?

最佳答案

编辑:更好的解决方案

正如安德斯所说,Enum.GetValues()可能是一个更好的主意。绑定(bind)到枚举的问题之一是标识符不能包含空格,因此默认情况下,绑定(bind)不会为您提供可读性好的字符串。

但是,您可以使用 Display 来装饰您的枚举。属性。引用 System.ComponentModel.DataAnnotations。

public class Equipment
{
public enum Type
{
Detector,
[Display(Name="Vegetation Clearance")]
VegetationClearance,
Removal,
Engaging
}
}

现在将以下属性添加到您的 ViewModel:

public IEnumerable<Equipment.Type> EquipmentTypes
{
get { return Enum.GetValues(typeof(Equipment.Type)).Cast<Equipment.Type>(); }
}

private Equipment.Type _selectedType;
public Equipment.Type SelectedType
{
get { return _selectedType; }
set { _selectedType = value; RaisePropertyChanged(() => SelectedType); }
}

我们要做的是创建一个值转换器,它将枚举转换为用于显示的字符串,该字符串将返回显示名称属性(如果存在)。

public class EnumDisplayNameValueConverter : MvxValueConverter
{
public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return GetEnumDisplayName((Enum)value);
}

public static string GetEnumDisplayName(Enum value)
{
var t = value.GetType();
var ti = t.GetTypeInfo();
var fi = ti.DeclaredFields.FirstOrDefault(x => x.Name == value.ToString());

var attributes = (DisplayAttribute[])fi.GetCustomAttributes(typeof(DisplayAttribute), false);

if (attributes != null && attributes.Length > 0)
{
return attributes[0].Name;
}
return value.ToString();
}
}

为了使用值转换器,您需要在微调器中指定项目模板和下拉模板:

<Mvx.MvxSpinner
android:id="@+id/type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
local:MvxItemTemplate="@layout/spinneritem"
local:MvxDropDownItemTemplate="@layout/spinnerdropdownitem"
local:MvxBind="ItemsSource EquipmentTypes; SelectedItem SelectedType" />

并创建 spinneritem/spinnerdropdownitem 布局:

<?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:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
local:MvxBind="Text EnumDisplayName(.)" />

请注意,我们绑定(bind)到 EnumDisplayName(.) .即值转换器和 .表示当前值,即枚举。

我在 GitHub 上添加了一个示例。 https://github.com/kiliman/MvxSpinnerEnumSample

关于mvvmcross:如何使用枚举值作为 ItemsSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23704249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com