2008-10-29 27 views
74

Bir winform interop için bir açılır liste oluşturmaya çalışıyorum ve koddaki açılır menüyü oluşturuyorum. Ancak, verdiğim DataTemplate'e dayanarak veriyi bağlamak için bir sorunum var.C# kodunda DataTemplate nasıl oluştururum?

Neyi eksik?

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; 

cevap

133

//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; 

Benim diğer özellikleri böyle ayarlamak için TextBlock s tarihinde ToolTip belirledik aynı şekilde kullanabilirsiniz ... zaten drpCreditCardNumberWpf için ItemsSource vb kurduktan varsayarsak marjlar olarak.

+1

4 frameworkelementfactory sınıfı yoktur. Ben de xaml.load kullanmak istemiyorum. Bunu çözebileceğimiz başka bir yol var mı? – curiosity

+0

wp7 üzerinde çalışmıyor ... – swinefeaster

+1

Silverlight 4/5 ... ref .: http://blogs.msdn.com/b/scmorris/archive/2008/04/14/defining-silverlight-datagrid-columns -at-runtime.aspx – Nordes

-2

Aslında, hala başka bir yol var, bu FrameworkElementFactory şeylerden hoşlanmıyorsanız gerçekten beğeneceksiniz.

Ve bu sadece yani doğal koduna küçük değişiklikler yapar düşünüyorum bir UserControl beyan ve içine kontrol koymak ve sonra, UserControl aramaya biri FrameworkElementFactory sadece kullanın. (F #)

Basit demo kodu: Silverlight içinde

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) 
İlgili konular