2016-10-06 2 views
0

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

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

Если что-то неясно, сообщите мне.

Обновление: Для разъяснения

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

Update: Вот моя 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> 

UPDATE: Модель, Вид и ViewModel Отношения

  • MainWindow.xaml (Просмотреть) привязан к MainViewModel.cs (ViewModel). Короче говоря, MainWindow.xaml'sDataContext является MainViewModel.cs

  • MainWindow.xaml (View) имеет Frame

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

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

  • доступа текущей страницы»(в кадре) DataContext из DataContext в MainWindow (MainViewModel).
+0

Вы имеете в виду доступ к DataContext кода View из View? –

+0

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

+0

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

ответ

0

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

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; 

    } 

Он должен работать.

+0

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

+0

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

+0

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

Смежные вопросы