In my page I have a Binding Property of enum type:
[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);
}
I would like to call this page by GoToAsync:
MyEnum enumProp = MyEnum.ThisValue;
string dest = $"{nameof(MyPage)}?{nameof(MyPage.EnumProp)}={enumProp}";
await Shell.Current.GoToAsync(dest);
In my example, dest is "MyPage?EnumProp=ThisValue" and GoToAsync throws InvalidCastException.
So I added a TypeConverter to property EnumProp:
[TypeConverter(typeof(StringToEnumConverter<MyEnum>))]
public MyEnum EnumProp
First I implemented StringToEnumConverter<T> derived from Xamarin.Forms.TypeConverter then I implemented interface IValueConverter.
In both cases InvalidCastException is thrown:
Edit: Stack Trace is as follows:
System.InvalidCastException
HResult=0x80004002
Nachricht = Invalid cast from 'System.String' to 'XXX.MyEnum'.
Quelle = System.Private.CoreLib
Stapelüberwachung:
bei System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider)
bei Xamarin.Forms.ShellContent.ApplyQueryAttributes(Object content, IDictionary`2 query, IDictionary`2 oldQuery)
bei Xamarin.Forms.BindableObject.SetValueCore(BindableProperty property, Object value, SetValueFlags attributes, SetValuePrivateFlags privateAttributes)
bei Xamarin.Forms.BindableObject.SetValue(BindableProperty property, Object value, Boolean fromStyle, Boolean checkAccess)
bei Xamarin.Forms.ShellNavigationManager.ApplyQueryAttributes(Element element, IDictionary`2 query, Boolean isLastItem, Boolean isPopping)
bei Xamarin.Forms.ShellSection.<GoToAsync>d__69.MoveNext()
bei Xamarin.Forms.ShellNavigationManager.<GoToAsync>d__13.MoveNext()
bei XXX.MyPage.<ToDetail>d__17.MoveNext() in C:\Users\MyUser\Development\...\PackObjectItem.cs: Zeile46
End Edit
What is to do in my case?
You can convert the data to a string type and pass it through.
Please refer to the following code:
Then you can pass data as follows:
Note
1.the string
mypageis the route of pageMyPage2.the code of
MyEnum.csis: