Я столкнулся с проблемой, которая возникает в разделе в определенном сценарии DataContext не применяется к пользовательскому интерфейсу. Итак, по сути, я регистрирую в своем сервисе Frame, на который подписано событие Navigated:
Код: Выделить всё
public void RegisterFrame(string frameKey, Frame frame) {
if (!frames.TryGetValue(frameKey, out FrameNavigationModel? frameNavigationModel)) {
throw new InvalidOperationException($"Frame with key {frameKey} not found.");
}
if (frameNavigationModel.Frame != null) {
return;
}
frameNavigationModel.Frame = frame;
frame.Navigated += OnFrameNavigated;
}
private void OnFrameNavigated(object sender, NavigationEventArgs e) {
Page page = (Page)e.Content;
if (e.ExtraData is ViewModelBase viewModelBase) {
page.DataContext = viewModelBase;
}
}
Снимок экрана 1: Запуск

Снимок экрана 2: переход к разделам «Настройки» и «Среда»< /p>

Снимок экрана 3: переход от «Среды» к «Выполнению»

Снимок экрана 4: переход от «Выполнение» к «Среда» (вы можете видеть, контекст данных применяется правильно)

Снимок экрана 5: переход от «Настройки» к «Сценарии»< /p>

Снимок экрана 6: переход из «Сценариев» обратно в «Настройки» и «Среда» (вы можете видеть, что DataContext НЕ применяется правильно.

Снимок экрана 7: показана страница среды выполнения.DataContext, где мы видим, что DataContext применяется правильно.

Теперь позвольте мне рассказать вам больше о том, как я использую навигацию:
Код: Выделить всё
public void Navigate(string frameKey, Uri pageUri) {
if (!frames.TryGetValue(frameKey, out FrameNavigationModel? frameModel))
throw new InvalidOperationException($"Frame model with key {frameKey} not found.");
if (frameModel.Frame == null) {
throw new InvalidOperationException($"Frame with key {frameKey} not registered.");
}
// Frame will not have absolut path as CurrentSource
// -> Combine with BasePath
Uri currentSource = new Uri(frameModel.BasePath + frameModel.Frame.CurrentSource.ToString());
if (!frameModel.ViewModelMapping.TryGetValue(currentSource, out Type? viewModelType)) {
throw new InvalidOperationException($"Page Uri {frameModel.Frame.CurrentSource} not found.");
}
if (viewModelCache.TryGet(viewModelType, out ViewModelBase? viewModel)) {
viewModelCache.AddOrUpdate((ViewModelBase)((Page)frameModel.Frame.Content).DataContext);
}
if (frameModel.ViewModelMapping.TryGetValue(pageUri, out Type? newViewModelType)) {
ViewModelBase newViewModel = viewModelCache.GetOrNew(newViewModelType);
frameModel.Frame.Navigate(pageUri, newViewModel);
}
else {
frameModel.Frame.Navigate(pageUri);
}
}
Единственное, что я пробовал, — это отладку приложения. Я не вижу разницы при первом переходе в «Настройки» и во второй раз при переходе в «Настройки». Потому что оба раза кеш уже будет содержать «SettingsPageViewModel» и использовать его.
Подробнее здесь: https://stackoverflow.com/questions/786 ... ect-the-ui
Мобильная версия