Можно ли получить доступ к DataContext текущей страницы фрейма? Как?

#c# #wpf #frame #datacontext

#c# #wpf #фрейм #datacontext

Вопрос:

В wpf можно ли получить доступ к DataContext текущей страницы фрейма? Если ДА, то как?

Если НЕТ, что я должен использовать в качестве замены для frame, чтобы я мог получить доступ к его DataContext?

Если что-то не понятно, пожалуйста, скажите мне.

Обновление: для пояснения

У меня есть Frame вход MainWindow.xaml . Я хочу получить доступ DataContext к текущей странице, отображаемой в Frame . Давайте просто скажем, что я хочу отобразить string свойство с именем title ViewModel текущей страницы. (Предположим, что каждая страница ‘ ViewModel имеет свойство title)

Обновление: вот мой MainWindow.xaml

 <Window x:Class="Libertalia.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        .
        .
        .
        DataContext="{Binding Main, Source={StaticResource Locator}}"
        >
        <ScrollViewer VerticalScrollBarVisibility="Auto">
            <Grid>
                <Frame Panel.ZIndex="1" x:Name="MainFrame" JournalOwnership="OwnsJournal" NavigationUIVisibility="Hidden" Source="View/BlankPage.xaml" />
            </Grid>
        </ScrollViewer>
</Window>
  

Код страницы (только один из них, просто образец):

 <Page x:Class="Libertalia.View.LoginView"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
      xmlns:behaviors="clr-namespace:Libertalia.Behavior"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      .
      .
      .
      DataContext="{Binding Page1, Source={StaticResource Locator}}"
    <DockPanel Margin="200" >

    </DockPanel>
</Page>
  

ОБНОВЛЕНИЕ: модель, представление и связь ViewModel

  • MainWindow.xaml (View) привязан к MainViewModel.cs (ViewModel). Короче говоря, MainWindow.xaml's DataContext это MainViewModel.cs

  • MainWindow.xaml (Просмотр) имеет Frame

  • Frame имеет Page (Просмотр). Frame имеет много страниц, отображаемых по одной за раз.
  • Page имеет свой собственный ViewModel ( DataContext )

Что я хочу сделать:

  • Доступ к текущей странице’ (фрейма) DataContext из DataContext MainWindow (MainViewModel).

Комментарии:

1. Вы имеете в виду доступ к DataContext представления из кода представления?

2. Нет, я хочу получить доступ к DataContext странице из MainWindow.xaml (родительского элемента Frame ).

3. Что вы подразумеваете под «страницей»?

4. Если я понимаю вашу идею, да — в целом это возможно, но вам нужно предоставить более подробную информацию о ваших моделях просмотра и представлениях. Добавьте код и объяснение.

5. Я улучшаю реальный код, потому что мне нужно увидеть взаимосвязь между вашими представлениями и моделями представлений. Что такое фрейм? Вы имеете в виду представление, которое является содержимым вашего окна?

Ответ №1:

Я не уверен, что это сработает для вас, потому что я все еще не понимаю взаимосвязи между моделями представления и моделями в вашей архитектуре, но попробуйте использовать эту идею:

1). xaml моего Window1 имеет следующее содержимое :

 <Grid>       
    <Frame Panel.ZIndex="1"
           x:Name="MainFrame"
           JournalOwnership="OwnsJournal"
           NavigationUIVisibility="Hidden"
           Source="UserControl1.xaml" />
</Grid>
  

2) UserControl1 имеет определение DataContext:

  public UserControl1()
    {
        InitializeComponent();
        DataContext = new MainViewModel();
    }
  

3). Код, в котором я извлекаю и изменяю DataContext содержимого моего фрейма:

    Window1 window = new Window1();
        //window.Content = uc;


        var aa = window.Content as Grid;

        foreach (var e in aa.Children)
        {
            if (e is Frame)
            {
                Frame f = e as Frame;
                f.ContentRendered  = F_ContentRendered;
            }
        }

//only inside of handler of ContentRendered event you can access to the content of your Frame:
  private void F_ContentRendered(object sender, EventArgs e)
    {
        var frame = sender as Frame;
        UserControl1 uc1 = frame.Content as UserControl1;
        MainViewModel mvm = uc1.DataContext as MainViewModel;

    }
  

Это должно сработать.

Комментарии:

1. Спасибо за усилия. Я добавил некоторый код к своему вопросу, чтобы вы лучше поняли мой сценарий. Но, как вы можете видеть, я использую MVVMLight так много кода в отдельных файлах, поэтому сложно опубликовать весь мой код.

2. Итак, в вашем случае в BlankPage.xaml есть целевой DataContext с моделью представления, которую вы хотите изменить. Правильно?

3. Я попробовал основную идею, которую я опубликовал в своем решении, и она все еще работает! Я могу получить доступ к DataContext и изменить его свойства. Я немного изменю свой пост.

4. Извините, но у меня это не работает. Куда вы поместили свой третий код? Я поместил его в MainViewModel, я прав?

5. Я понял это из-за вашего примера. Спасибо.