在我的页面中,我有一个枚举类型的绑定属性:
[QueryProperty(nameof(EnumProp), nameof(EnumProp))]
public partial class MyPage : ContentPage
{
public static readonly BindableProperty EnumPropProperty =
BindableProperty.Create(nameof(EnumProp), typeof(MyEnum), typeof(MyPage), propertyChanged: OnEnumPropChanged);
public MyEnum EnumProp
{
get => (MyEnum)GetValue(EnumPropProperty);
set => SetValue(EnumPropProperty, value);
}
我想通过
GoToAsync
调用此页面:
MyEnum enumProp = MyEnum.ThisValue;
string dest = $"{nameof(MyPage)}?{nameof(MyPage.EnumProp)}={enumProp}";
await Shell.Current.GoToAsync(dest);
在我的示例中,
dest
是"MyPage?EnumProp=ThisValue"
并且GoToAsync
抛出InvalidCastException
。
所以我向属性 EnumProp 添加了一个 TypeConverter:
[TypeConverter(typeof(StringToEnumConverter<MyEnum>))]
public MyEnum EnumProp
首先我实现了源自
StringToEnumConverter<T>
的 Xamarin.Forms.TypeConverter
,然后实现了接口 IValueConverter
。
在这两种情况下都会抛出 InvalidCastException
。
我的情况该怎么办?
可以将数据转换为字符串类型并通过。
请参考以下代码:
[QueryProperty(nameof(EnumProp), nameof(EnumProp))]
public partial class MyPage : ContentPage
{
public MyPage()
{
InitializeComponent();
}
public string EnumProp
{
set
{
LoadData(value);
}
}
private void LoadData(string value)
{
System.Diagnostics.Debug.WriteLine("the passed data is " + value);
Title = "---> "+value;
}
}
然后可以按如下方式传递数据:
MyEnum enumProp = MyEnum.Spring;
await Shell.Current.GoToAsync($"mypage?EnumProp={enumProp.ToString()}");
注意
1.字符串
mypage
是页面MyPage
的路径
Routes.Add("mypage", typeof(MyPage));
2.
MyEnum.cs
的代码是:
public enum MyEnum
{
Spring,
Summer,
Autumn,
Winter
}