2016-10-06 26 views
0

在wpf中,是否可以訪問框架當前頁面的DataContext?如果是,如何?是否可以訪問該框架的當前頁面的DataContext?怎麼樣?

如果不是,我應該使用什麼來替代幀,以便我可以訪問它的DataContext?

如果有事不清楚,請告訴我。

更新:澄清

我有一個MainWindow.xamlFrame。我想訪問Frame中顯示的當前頁面的DataContext。我們只是說我想顯示當前頁面的ViewModel的名稱爲string屬性標題。 (假設每個頁面」 ViewModel標題屬性)

更新:這是我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:模型,視圖和視圖模型關係

  • MainWindow.xaml(查看)綁定到MainViewModel.cs(ViewModel)。總之,MainWindow.xaml'sDataContextMainViewModel.cs

  • MainWindow.xaml(查看)具有Frame

  • FramePage(查看)。 Frame有許多頁面,一次顯示一個頁面。
  • Page有自己的視圖模型(DataContext

我想做的事:

  • 從主窗口(MainViewModel)的DataContextDataContext(的幀)訪問當前頁面」。
+0

您的意思是從View的代碼訪問View的DataContext? –

+0

不,我想從'MainWindow.xaml'('Frame'的父親)訪問頁面的'DataContext'。 – someone

+0

「頁面」是什麼意思? – LordWilmore

回答

0

我不知道它會爲你工作,因爲我還是不明白你的木構建築視圖模型和模型之間的關係,而是嘗試用這樣的觀念:

1)。我的窗口1的XAML有以下內容:

<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具有你想改變的視圖模型的目標D​​ataContext。對? –

+0

我嘗試了我在解決方案中發佈的主要想法,它仍然有效! 我可以訪問DataContext,並且可以更改其屬性。 我會稍微改變我的帖子。 –

相關問題