2012-09-24 56 views
4

我搜索一個選項,以c#代碼構建數據模板。 我用了:c#代碼隱藏的數據模板

DataTemplate dt = new DataTemplate(typeof(TextBox)); 

     Binding bind = new Binding(); 
     bind.Path = new PropertyPath("Text"); 
     bind.Mode = BindingMode.TwoWay; 

     FrameworkElementFactory txtElement = new FrameworkElementFactory(typeof(TextBox)); 
     txtElement.SetBinding(TextBox.TextProperty, bind); 

     txtElement.SetValue(TextBox.TextProperty, "test"); 


     dt.VisualTree = txtElement; 


     textBox1.Resources.Add(dt, null); 

但它不工作(它被放置在窗口的加載法 - 所以我的文本應顯示在窗口中啓動「測試」一詞)。任何想法?

+0

它不起作用 - 它是否會拋出異常,文本框爲空,還有其他問題嗎? – Divi

+0

以下是在SIlverlight中執行ControlTemplate的示例 - 不完全相同,但仍非常相似。看看它是否可以幫助你:[Silverlight中的Dynamic ControlTemplate](http://techfilth.blogspot.co.nz/2010/01/dynamic-controltemplate-in-silverlight.html) – slugster

+0

我可以啓動應用程序。 我也不例外。 但我的文本,我已與setvalue設置不顯示 – user1565467

回答

8

每個元素都需要添加到當前的可視化樹中。例如:

ListView parentElement; // For example a ListView 

// First: create and add the data template to the parent control 
DataTemplate dt = new DataTemplate(typeof(TextBox)); 
parentElement.ItemTemplate = dt; 

// Second: create and add the text box to the data template 
FrameworkElementFactory txtElement = 
    new FrameworkElementFactory(typeof(TextBox)); 
dt.VisualTree = txtElement; 

// Create binding 
Binding bind = new Binding(); 
bind.Path = new PropertyPath("Text"); 
bind.Mode = BindingMode.TwoWay; 

// Third: set the binding in the text box 
txtElement.SetBinding(TextBox.TextProperty, bind); 
txtElement.SetValue(TextBox.TextProperty, "test"); 
+0

謝謝,但我不明白,你的意思是綁定。 我的綁定設置爲TwoWay ... maye整個代碼? – user1565467

+0

如果我將它設置爲綁定,我以後不能更改它,或者是錯誤的? – user1565467

+0

@ user1565467我誤讀了有關綁定的細節,並刪除了令人困惑的陳述。只要首先將它添加到可視化樹中,並且綁定應該像描述的那樣工作,假設PropertyPath正確並且父控件的DataContext是正確的。 – akton