page.DataContext не унаследован от родительского фрейма?

У меня есть страница page в frame Frame, с frame.DataContext = "foo" .

  • (page.Parent as Frame).DataContext – это "foo" . ОК
  • BindingExpression для page.DataContext имеет значение null (также принудительно с ClearValue). ОК
  • page.DataContext имеет значение null . но я ожидал «foo»!

Почему DataContext не унаследован? Насколько я понимаю, кадр изолирует содержимое. Но я не мог найти никакой документации по этому поведению – может ли кто-нибудь указать мне место, где это упоминается?

Чтобы ответить на ваш вопрос о документации по этому поводу: это не документация Microsoft, но у меня есть несколько книг WPF, в которых упоминаются об этом.

« Essential Windows Presentation Foundation » говорит: (стр. 160-161)

Есть две интересные модели для размещения навигационного контента: изолированный хостинг и интегрированный хостинг.

С изолированным хостингом контент не доверяется и запускается в полностью изолированной (изолированной) среде. Так размещается контент WPF при работе в веб-браузере системы как приложение браузера XAML. Для навигации к другому приложению или содержимому HTML эта изолированная модель хостинга поддерживается объектом Frame .

Интегрированный хостинг, в котором мы хотим, чтобы контент вел себя как часть нашего приложения, вообще не поддерживается в системе. Когда Frame перемещается к контенту внутри приложения, мы получаем нечетный гибрид изолированного и интегрированного поведения. Frame изолирует свой контент от его стиля (и его родительского стиля), но не от стиля приложения. События не выходят из содержимого в Frame ; однако объекты доступны из свойства Content (что означает, что они не изолированы в смысле безопасности).

По всем этим причинам Frame наиболее полезен, когда мы работаем с внешним контентом, но его можно тщательно использовать для контента приложения.

Это все, что он должен сказать – ничего о наследовании собственности.

« Windows Presentation Foundation Unleashed говорит (стр. 95):

Управление Frame содержит произвольный контент, как и все остальные элементы управления содержимым, но изолирует контент от остальной части пользовательского интерфейса. Например, свойства, которые обычно наследуются вниз по дереву элементов, останавливаются, когда они достигают Frame .

Вы специально не задавались вопросом, как вы можете сделать эту работу, только почему это не по умолчанию. Однако, если вы хотите, чтобы ваши страницы наследовали DataContext Frame, вы можете сделать это:

В XAML:

  

В коде:

 private void frame_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { UpdateFrameDataContext(sender, e); } private void frame_LoadCompleted(object sender, NavigationEventArgs e) { UpdateFrameDataContext(sender, e); } private void UpdateFrameDataContext(object sender, NavigationEventArgs e) { var content = frame.Content as FrameworkElement; if (content == null) return; content.DataContext = frame.DataContext; } 

Чтобы основываться на ответе @ Joe-White для тех, кто хочет знать, как сделать каскад Frame DataContext , я упомянул, что это также можно выполнить только в XAML.

   

Для тех, кто не App.xaml с WPF, вы можете поместить этот XAML в файл App.xaml чтобы он App.xaml все элементы управления Frame в приложении, которые выбирают стиль по умолчанию. Это означает, что вам не нужно писать конкретный код при каждом использовании нового Frame .

Я использовал VisualStudio 2015 Visual Designer (см. Рис. Ниже), чтобы создать основную часть XAML выше, а затем добавил DataContext="{TemplateBinding DataContext}" для выполнения каскада.

Дизайнер VS2015

  • Файл метаданных '.dll' не найден.
  • WPF: как программно удалить фокус из TextBox
  • Замена точки входа WPF
  • Режим рендеринга программ - WPF
  • Что означает «{Binding Path =.}» В привязке WPF?
  • Как скрыть столбцы datagrid wpf в зависимости от свойства
  • Пользовательский блок сообщений
  • databind свойство Source для WebBrowser в WPF
  • DependencyProperty getter / setter не вызывается
  • Виртуализация WPF DataGrid с группировкой
  • Как использовать привязки WPF с RelativeSource?
  • Interesting Posts

    Нарисуйте полупрозрачное оверлейное изображение по всей форме windows, имеющее некоторые элементы управления

    Как использовать «содержит» или «как» в динамическом запросе linq?

    Java-эквивалент шифрования OpenSSL AES CBC

    Как проверить логическое состояние в EL?

    Как сделать загрузочный раздел Boot Camp еще раз?

    Как безопасно разбить жесткий диск, чтобы принять дистрибутив GNU / Linux в присутствии OneKey Recovery?

    Что мне нужно сделать, чтобы заставить Core Data автоматически переносить модели?

    Некоторые CD-R не работают в автомобиле .. иногда

    Значок в закладке не отображается

    Ssh зависает при попытке подключения к некоторым хостам

    Как изменить значок принтера, отображаемый на панели управления

    Просмотр рабочего стола Xubuntu в полноэкранном режиме под Virtualbox в Windows 8

    Не удается получить доступ к USB-накопителю

    Использование автозапуска Spring 3 в автономном приложении Java

    Как выполнять команды на уровне root в Linux (Fedora) Live Media

    Давайте будем гением компьютера.