2008-10-29 16 views
74

मैं एक Winform इंटरऑप के लिए एक ड्रॉपडाउन सूची बनाने की कोशिश कर रहा हूं, और मैं कोड में ड्रॉपडाउन बना रहा हूं। हालांकि, मुझे डेटा टेम्पलेट I निर्दिष्ट करने के आधार पर डेटा को बाध्य करने में समस्या हो रही है।मैं सी # कोड में डेटा टेम्पलेट कैसे बना सकता हूं?

मुझे क्या याद आ रही है?

drpCreditCardNumberWpf = new ComboBox(); 
DataTemplate cardLayout = new DataTemplate {DataType = typeof (CreditCardPayment)}; 
StackPanel sp = new StackPanel 
{ 
    Orientation = System.Windows.Controls.Orientation.Vertical 
}; 

TextBlock cardHolder = new TextBlock {ToolTip = "Card Holder Name"}; 
cardHolder.SetBinding(TextBlock.TextProperty, "BillToName"); 
sp.Children.Add(cardHolder); 

TextBlock cardNumber = new TextBlock {ToolTip = "Credit Card Number"}; 
cardNumber.SetBinding(TextBlock.TextProperty, "SafeNumber"); 
sp.Children.Add(cardNumber); 

TextBlock notes = new TextBlock {ToolTip = "Notes"}; 
notes.SetBinding(TextBlock.TextProperty, "Notes"); 
sp.Children.Add(notes); 

cardLayout.Resources.Add(sp, null); 

drpCreditCardNumberWpf.ItemTemplate = cardLayout; 

उत्तर

133

मान लिया जाये कि आप पहले से ही drpCreditCardNumberWpf के लिए ItemsSource आदि सेट कर लिया है ...

//create the data template 
DataTemplate cardLayout = new DataTemplate(); 
cardLayout.DataType = typeof(CreditCardPayment); 

//set up the stack panel 
FrameworkElementFactory spFactory = new FrameworkElementFactory(typeof(StackPanel)); 
spFactory.Name = "myComboFactory"; 
spFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal); 

//set up the card holder textblock 
FrameworkElementFactory cardHolder = new FrameworkElementFactory(typeof(TextBlock)); 
cardHolder.SetBinding(TextBlock.TextProperty, new Binding("BillToName")); 
cardHolder.SetValue(TextBlock.ToolTipProperty, "Card Holder Name"); 
spFactory.AppendChild(cardHolder); 

//set up the card number textblock 
FrameworkElementFactory cardNumber = new FrameworkElementFactory(typeof(TextBlock)); 
cardNumber.SetBinding(TextBlock.TextProperty, new Binding("SafeNumber")); 
cardNumber.SetValue(TextBlock.ToolTipProperty, "Credit Card Number"); 
spFactory.AppendChild(cardNumber); 

//set up the notes textblock 
FrameworkElementFactory notes = new FrameworkElementFactory(typeof(TextBlock)); 
notes.SetBinding(TextBlock.TextProperty, new Binding("Notes")); 
notes.SetValue(TextBlock.ToolTipProperty, "Notes"); 
spFactory.AppendChild(notes); 

//set the visual tree of the data template 
cardLayout.VisualTree = spFactory; 

//set the item template to be our shiny new data template 
drpCreditCardNumberWpf.ItemTemplate = cardLayout; 

आप उसी तरह मैं TextBlock रों पर ToolTip निर्धारित किया है अन्य संपत्तियों के इस तरह स्थापित करने के लिए उपयोग कर सकते हैं मार्जिन के रूप में

+1

4 frameworkelementfactory वर्ग वहाँ नहीं है। मैं xaml.load का भी उपयोग नहीं करना चाहता .. क्या कोई अन्य तरीका है जिसके साथ हम इसे हल कर सकते हैं? – curiosity

+0

wp7 पर काम नहीं करता है ... – swinefeaster

+1

चांदी की रोशनी के लिए 4/5 ... रेफ .: http://blogs.msdn.com/b/scmorris/archive/2008/04/14/defining-silverlight-datagrid-columns -at-runtime.aspx – Nordes

-2

ठीक है, वास्तव में हम अभी भी एक और तरीका है, तो आप वास्तव में इसे पसंद करता है, तो आप उन FrameworkElementFactory बातें नापसंद होगा।

और मुझे लगता है कि यह सिर्फ प्राकृतिक कोड को मामूली परिवर्तन, जो है बनाता है, एक UserControl घोषित करने और इसे में अपने नियंत्रण रखा, और उसके बाद, बस का उपयोग एक FrameworkElementFactoryUserControl कॉल करने के लिए। (एफ # में)

सरल डेमो कोड:

let buildView()=StackPanel() 
//Build it with natural code 
type MyView()=inherit UserControl(Content=buildView()) 
let factory=FrameworkElementFactory(typeof<MyView>) 
let template=DataTemplate(VisualTree=factory) 
let list=ItemsControl(ItemsSource=makeData(),ItemTemplate=template) 
Silverlight में