Фреймовая навигация - DataContext не наследуется - PullRequest
2 голосов
/ 24 января 2012

У меня есть XAML-файл, представляющий главное окно приложения WPF.Теперь я хочу, чтобы это окно отображало содержимое, указанное в другом файле XAML.Это работает, но DataContext потеряно в коде C # моего UserControl.

Я думаю, что <Frame Source=....> каким-то образом нарушает логическое дерево WPF.Я хотел бы иметь такое же поведение, как если бы <Frame Source=....> был просто заменен содержимым файла Content1.xaml , то есть DataContext окружающего класса Window наследуется UserControl.

Есть ли простой способ преодолеть эту проблему?Все решения , которые я нашел, кажутся излишними.

Псевдокод

MainWindow.xaml

<Window ....>
    <Frame Source="Content1.xaml" />
</Window>

Content1.xaml

<UserControl ....>
  <!-- Content goes here -->
</UserControl>

1 Ответ

7 голосов
/ 06 февраля 2014

Решение Джо Уайта здесь решает проблему.

Цитата из его ответа:

В XAML:

<Frame Name="frame"
       LoadCompleted="frame_LoadCompleted"
       DataContextChanged="frame_DataContextChanged"/>

В коде позади:

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;
}
...