2011-05-18 51 views
1

我有一個silverlight用戶控件,它被綁定到一個Document對象。文檔類包含一個Field對象數組。目的是當控件綁定到文檔時,文檔中的每個字段都綁定到用​​戶控件中的控件。每個字段都有一個名稱,並且用戶控件中要綁定到該字段的控件被賦予相同的名稱(所以如果字段被稱爲「FirstName」,用戶控件中將出現一個文本框,其中x:Name = 「名字」)。爲了確定哪些控制是綁定到我用下面的代碼字段:Silverlight Tab Control,FindName不總是正常工作

private void BindDocumentToUserControl(Document document) 
{ 
    foreach (Field field in document.Fields) 
    { 
     Control c = this.FindName(field.Name); 

     if (c != null) 
     { 
      //bind control to field... 
     } 
    } 
} 

,直到我試圖把控件成片控制一切工作正常。當用戶控件第一次加載時(並且用戶還沒有自己改變選定的標籤),那麼上面的方法找到所有的控件。但是,如果用戶更改選定的選項卡,然後重新綁定該控件,則this.FindName將僅查找選定選項卡中的控件。如果我在不同的選項卡中傳遞控件的名稱,我知道它是正確的,它仍然會返回null。

我在下面找到了關於同一問題的文章,但是這個解決方案並沒有真正爲我想要做的事情做出評價。任何幫助將不勝感激

http://forums.silverlight.net/forums/p/59912/248977.aspx

+0

我不能提出一個解決方案,但原因是不活動的標籤項目沒有渲染,FindName遍歷可視樹,所以這就是爲什麼它失敗。我真的不明白你想實現什麼,但是對於運行時查看注入我建議看一下PRISM:http://compositewpf.codeplex.com/ – dain 2011-05-18 10:48:41

回答

1

作爲一個有點答案的黑客攻擊,無法您一次加載控件爲每個標籤到隱藏面板,一個標籤,那麼一旦控制被加載,將它們移回標籤?

我不能說這絕對有效,但它的聲音「邏輯」,如果有點骯髒的黑客的....

+1

解決方法我想出了幾乎與此相同。我修改了調用上面的BindDocumentToUserControl方法的代碼。而不是僅在調用標籤控件中的每個選項卡項目時循環調用,並在調用方法之前將其設置爲活動選項卡。不是很好,因爲它意味着所有的文檔字段都是迭代遍歷每個面板,而不是一次,但現在它會做 – 2011-05-18 13:39:47