我遇到了一个特殊的问题,即暂停我的应用程序的开发。我有一个选择器,用户可以从中选择付款类型(此应用程序不处理付款,其费用页面)。我在下面描绘了这个。
选择器后面是一个名为Payment Type
的枚举。我已经使用了一些代码,并且即将将枚举名称转换为更令人愉悦的字符串格式(CreditCard - >信用卡)。
参考文献: enum set to string and get sting value when need https://alexdunn.org/2017/05/16/xamarin-tip-binding-a-picker-to-an-enum/
我正在使用MVVM和数据绑定来设置此选择器,这是拾取器绑定到的属性:
PaymentType _selectedPaymentMethod;
public string SelectedPaymentMethod
{
set
{
var enumValue = _enumHelper.ConvertStringToPaymentTypeEnum(value);//ConvertStringToEnum<PaymentType>(value);
if(SetProperty(ref _selectedPaymentMethod, enumValue))
{
_expenseItem.PaymentType = _selectedPaymentMethod;
_canCreateExpense = validateForm();
}
}
get
{
return _enumHelper.ConvertPaymentTypeEnumToString(_selectedPaymentMethod);//ConvertEnumToString<PaymentType>(_selectedPaymentMethod);
}
}
在我们查看被调用的方法之前,让我们看看我们的枚举:
public enum PaymentType
{
[Description("None")]
None,
[Description("Credit Card")]
CreditCard,
[Description("Cash")]
Cash
}
所以我有一个enum帮助器类,我用它来将枚举转换为字符串并返回。我发现如果将enum直接放入选择器中,我的文本格式很差,如果我格式化了文本,set
事件从未被触发过。因此,我必须将我的枚举转换为List<string>
以显示它并转换回处理它。此外,枚举的默认值为none,我从视图中隐藏,枚举默认为0,因此当我调用validate时,我的属性是如何设置的。
现在让我们看看我正在调用的方法:
public PaymentType ConvertStringToPaymentTypeEnum(string text)
{
foreach (var value in Enum.GetValues(typeof(PaymentType)))
{
PaymentType enumValue = (PaymentType)value;
if (text == enumValue.GetDescription())
{
return enumValue;
}
}
return 0;
}
public string ConvertPaymentTypeEnumToString(PaymentType paymentType)
{
foreach (var value in Enum.GetValues(typeof(PaymentType)))
{
PaymentType enumValue = (PaymentType)value;
if (paymentType == enumValue)
{
return paymentType.GetDescription();
}
}
return "";
}
这一切都很好,应用程序正常运行,看看它的实际效果:
现在,这个enum方法被硬编码为1个enum类型,这两个方法是不可重用的...我不想要,因为我可能想在别处使用它。所以一旦我在这里实现它,我决定将这些方法转换为使用泛型类型,因此我可以将它们与其他枚举一起使用。让我们来看看我做了什么。
public T ConvertStringToEnum<T>(string text)
{
foreach (var value in Enum.GetValues(typeof(T)))
{
T enumValue = (T)value;
var enumVal = enumValue as Enum;
if (text == enumVal.GetDescription())
{
return enumValue;
}
}
return default(T);
}
public string ConvertEnumToString<T>(Enum @enum)
{
foreach (var value in Enum.GetValues(typeof(T)))
{
Enum enumValue = (T)value as Enum;
if (@enum == enumValue)
{
return @enum.GetDescription();
}
}
return "";
}
现在,如果我调用这些新方法(注意它们之前已经注释掉),我会遇到最愚蠢的最不敏感的错误。两种方法都能工作并返回我想要的东西,但是再次调用setter并且方法返回默认值(特别是第一个方法,ConvertStringToEnum)
看看应用程序现在如何运行....
因此,当我将方法类型更改为泛型时,ProcessedState
的setter会被调用两次....什么?
我不知道这里发生什么,谷歌搜索似乎没有帮助。什么在Xamarin的名字正在发生?
note 我正在使用Prism DryIos这个应用程序,但是我强烈怀疑它是否会导致这个问题。