Установка DataContext не влияет на пользовательский интерфейс.C#

Место общения программистов C#
Ответить
Anonymous
 Установка DataContext не влияет на пользовательский интерфейс.

Сообщение Anonymous »

Привет, у меня вопрос по поводу DataContext. Я создал себе NavigationService, потому что хотел его опробовать. Я кэширую ViewModel со страницы и повторно использую ее при переходе назад (я знаю, что есть встроенная история навигации, но я хотел попробовать это сам).
Я столкнулся с проблемой, которая возникает в разделе в определенном сценарии 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»