2016-05-12 26 views
1

在我MainWindow我有這樣的:如何訪問從一個用戶控件主窗口的datacontext已宣告但尚未當地一個

<Window.DataContext> 
    <viewModel:ActiveRecord /> 
</Window.DataContext> 

在我UserControl我有這樣的:

<UserControl.DataContext> 
    <search:CustomerSearch /> 
</UserControl.DataContext> 

我說這之前'本地'綁定我會參考我的UserControl這樣的「模塊化」綁定:

var vm = this.DataContext as ViewModel.ActiveRecord; 

,但因爲我想引用2個不同的綁定,它似乎不再工作。我的意思是我用值填充ActiveRecord,但當我導航到另一種形式時,這些值爲空。
我想我需要做的是訪問Mainwindow'sDataContext這樣的:

var vm = MainWindow.DataContext as ViewModel.ActiveRecord; 

當然DataContext的,但不是我怎麼能做到這一點的MainWindow

的屬性?

+1

您不應該像在XAML中那樣對.DataContext進行硬編碼。它默認WPF的最大優點之一是具有單獨的用戶界面和數據層,並且可能在以後引發各種問題。根據你迄今爲止所說的,聽起來你最好擁有一個CustomerSearch屬性的ActiveRecord,並且使用一個Implicit DataTemplate來綁定它。也就是說,Window應該有一個DataContext屬性,我很確定MainWindow從Window繼承...你確定你有正確的參考嗎?或者只是施放它。 – Rachel

+0

@Rachel感謝您抽出時間發表評論。我從教程中複製了XAML datacontext的東西,但現在你解釋了爲什麼你不應該這樣做是完全不合理的。 Window對象不公開DataContext方法 - 它是一個靜態對象嗎?我最終將CustomerSearch放入ActiveRecord類中。在「模塊化」範圍的代碼中,如何設置數據上下文的首選方式/方式是什麼?謝謝BTW –

+1

通常我會有一個'AppViewModel'來代表整個應用程序。從那裏,應用程序的每個屏幕通常都有它自己的ViewModel,比如'HomeViewModel'或'SearchViewModel'。這些是AppViewModel的屬性。每個屏幕虛擬機可以包含表示UI上元素的其他ViewModel或模型的屬性,例如可能是ActiveRecord。 [這是我的博客文章](https://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/)應該讓你知道我的意思,或者[這個答案]( http://stackoverflow.com/a/12322363/302677) – Rachel

回答

0

從用戶的控制,你可以設置一個相對結合這將是這個樣子的文本塊上的用戶控件:

  <TextBlock Text="{Binding Path=DataContext.PropertyYouWant, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}}}" /> 

它似乎像你對我是通過錯誤的做法會對此雖然。您的用戶控件從其父項(即窗口)繼承它的數據上下文是正常的)。是否有可能讓活動記錄訪問客戶搜索?

+0

嗨,謝謝你的回答。我有這種方式,一切都從主要datacontext繼承,但我擔心我的虛擬機會變得太大。你提出的解決方案不能解決我的問題,我知道使用親戚。我遇到的問題是通過具有自己的datacontext集的UserControl中的代碼引用MainWindow Datacontext –

相關問題