как выполнять навигацию оболочки со сложными объектами в .net MAUI или Xamarin Forms?
Недавно я начал использовать оболочку и заметил улучшение в переходе между страницами, а ошибка, с которой я столкнулся при использовании NavigationPage, была исправлена простой заменой ее на оболочку.
Так что я был взволнован, чтобы использовать его.
Однако вскоре после того, как я понял, что не могу отправлять объекты со страницы на страницу через оболочку, как я мог бы использовать конструктор страницы. Я немного поискал и теперь знаю, что оболочка передает только строки. Я преобразовал объект в JSON, но затем столкнулся с исключением из-за большой длины URI.
Честно говоря, я разочарован. Я думал, что что-то столь важное будет реализовано в оболочке... но в любом случае, как вы, ребята, работаете с этим?
1 ответ
Для Мауи.
См. (Xamarin) Обработка данных навигации с помощью одного метода .
Также упоминается в выпуске Мауи . Адаптация вызова Мауи здесь:
await Shell.Current.GoToAsync("//myAwesomeUri",
new Dictionary { {"data", new MyData(...)} });
Это использует
IQueryAttributable
а также
ApplyQueryAttributes
пройти
IDictionary<string, object> query
.
(Пример Xamarin показывает
IDictionary<string, string>
, но это
, object
на Мауи, поэтому вы можете передавать любые значения объекта.)
Таким образом, строковые параметры, которые вы передаете, могут использоваться для поиска соответствующих объектов.
Из этого документа (Xamarin) (измененного для отображения поиска объекта):
public class MonkeyDetailViewModel : IQueryAttributable, ...
{
public MyData Data { get; private set; }
public void ApplyQueryAttributes(IDictionary<string, object> query)
{
Data = (MyData)query["data"];
}
...
}
Для Xamarin Forms ограничение на строковые значения делает это немного уродливым. Один из подходов состоит в том, чтобы иметь , который содержит возможные объекты, которые вы ищете, используя строку. Это терпимо, когда все объекты предопределены, но немного неуклюже, если вы вручную изменяете эти объекты.
public class MonkeyDetailViewModel : IQueryAttributable, ...
{
public static Dictionary<string, MyData> KeyedData;
// "static": One-time class constructor.
public static MonkeyDetailViewModel()
{
KeyedData = new Dictionary<string, MyData>();
KeyedData["data1"] = new MyData(...);
// ... other versions of the data ...
}
public MyData Data { get; private set; }
public void ApplyQueryAttributes(IDictionary<string, string> query)
{
string whichData = query["data"]; // In example, gets "data1".
Data = KeyedData[whichData];
}
...
}
Применение:
await Shell.Current.GoToAsync("//myAwesomeUri",
new Dictionary { {"data", "data1"} });
Xamarin ПРИМЕЧАНИЕ. Статический словарь позволяет поддерживать несколько экземпляров
MyData
. Альтернатива «взломать» состоит в том, чтобы иметь
MyData Data
быть
static
, и явно установите его перед
GoToAsync
- но это рискованно, если у вас когда-нибудь может быть MonkeyDetailView в стеке навигации, перейдите ко второму, а затем вернитесь к первому - вы перезапишете
Data
видно с первого взгляда.