2010-11-11 112 views
4

我有一個Silverlight控件,我實例化,像這樣:如何訪問一個Silverlight控件的datacontext的代碼隱藏

<MyControls:SomeControl DataContext="{Binding}" /> 

在這個文件中的代碼隱藏,我怎麼可以訪問這個的datacontext ? this.DataContext等於null。

編輯(詳細信息):

我建立了一個現有的Silverlight應用程序的擴展。我的地步,我與應用程序整合看起來是這樣的:

<DataTemplate x:Key="AnImportantIdentifierUsedByTheHostApp"> 
    <MyControls:SomeControl DataContext="{Binding}" /> 
</DataTemplate> 

在我的控制,我能夠對屬性綁定像這樣:

<Hyperlink NavigateUri="{Binding Path=UriWithSlug}"> 

而這一切工作正常。然而,對於某些功能(特別是,我需要使用WebBrowser控件和NavigateToString()方法),我需要從DataContext訪問屬性。

基本上在代碼隱藏,我需要做一些事來的效果:

myWebBrowser.NavigateToString(DataContext.MyHTMLStringProperty); 

回答

1

答案當然是超級直觀,我敢肯定,大家可能以爲我在做...

直到控件的Loaded事件觸發時,DataContext纔可用。

public MyUserControl() { 
    var dc = this.DataContext // DataContext is null here in the ctor. 

    this.Loaded += (s, e) => { 
     var sc2 = this.DataContext // Loaded event fires, DataContext exists! 
    }; 
} 

再次,我敢肯定,這可能是許多SL開發人員顯而易見的,但它完全絆倒了我。

+0

感謝您發佈此信息。不要感到孤單,我犯了同樣的錯誤。現在,看起來顯而易見的是,該構造函數中的DataContext將爲空。 – 2011-08-05 10:18:25

0

好了,現在讓一些更有意義。相應地更改答案...

基本上,你應該永遠不需要DataContext = {綁定}。項目的DataContext由父控件設置(每個項目)。在從ItemsSource中的條目生成的大多數列表類型的控件中。

  1. 你可以刪除DataContext = {Binding}並檢查它是否仍然有效?
  2. 如果實際的子控件本身沒有顯式的DataContext值,那麼要獲得父控件的DataContext,您可能需要向上瀏覽可視樹(直到找到非空的DataContext)。

你能提供更多的代碼/ xaml我們可以在上下文中看到上面的代碼嗎?

+0

問題更新了一些更多的信息。 – ChadT 2010-11-11 11:47:27

+0

實際上'DataContext'屬性應該返回當前的「非空DataContext」,它會爲您搜索可視化樹。 – AnthonyWJones 2010-11-11 12:50:25

+0

@AnthonyWJones:很對,但昨晚睡得很少我不想那麼肯定地說:) – 2010-11-11 13:45:35

3

您並不需要DataContext={Binding},因爲這相當於DataContext = DataContext

但是你缺少的是類型信息。綁定使用反射來解析屬性路徑,但是在代碼隱藏中,您需要知道由DataContext返回的對象的類型。

如果你可以肯定的是那麼這將僅僅是: -

myWebBrowser.NavigateToString(((MyType)DataContext).MyHTMLString); 

如果你不能確定的類型和/或你無法說服誰控制你的控制主機爲了確保至少有一個具有已知成員的特定接口被實現,那麼你可能需要自己去反思。

使用綁定製做的反射對你

,如果你不知道該類型屬性的唯一名稱的替代: -

public string HTMLString 
{ 
    get { return (string)GetValue(HTMLStringProperty); } 
    set { SetValue(HTMLStringProperty, value); } 
} 
public static DependencyProperty HTMLStringPropery = 
    DependencyProperty.Register(
     "HTMLString", 
     typeof(string), 
     typeof(SomeControl), 
     null); 

現在,如果你確定您知道要綁定的財產的名稱,您可以在控件構造函數中設置代碼中的綁定: -

SetBinding(HTMLStringProperty, new Binding("MyHTMLString")); 

Wi日這地方你的代碼看起來像: -

myWebBrowser.NavigateToString(HTMLString); 

或者你會作出綁定控件的這個新屬性XAML中的責任: -

<DataTemplate x:Key="AnImportantIdentifierUsedByTheHostApp">     
    <MyControls:SomeControl HTMLString="{Binding MyHTMLString}" />     
</DataTemplate> 
+0

好吧,我已經刪除了加載控件的XAML上的DataContext = {Binding},並且我知道DataContext的類型,但是我的問題仍然存在,在代碼後面,DataContext是== null。 myWebBrowser.NavigateToString(((的MyType)的DataContext).MyHTMLString);拋出一個異常,因爲DataContext爲null。 – ChadT 2010-11-11 21:57:42

0
var mytype = this.DataContext as MyType; 

作爲預防措施,我會檢查後爲零:

if (mytype!=null) 
{ 
    // do something here 
    myWebBrowser.NavigateToString(mytype.MyHTMLStringProperty); 
} 
+0

this.DataContext始終爲空!這是我的問題! – ChadT 2010-11-12 23:03:59

相關問題