2008-10-29 8 views
74

J'essaye de construire une liste déroulante pour un interop de winform, et je crée la liste déroulante dans le code. Cependant, j'ai un problème pour lier les données en fonction du DataTemplate que je spécifie.Comment créer un DataTemplate dans un code C#?

Qu'est-ce qui me manque?

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; 

Répondre

133

En supposant que vous avez déjà configuré le ItemsSource etc pour drpCreditCardNumberWpf ...

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

Vous pouvez utiliser la même façon que j'ai mis le ToolTip sur les TextBlock s pour définir d'autres propriétés comme des marges.

+1

dans silverlight 4 classe frameworkelementfactory est pas là. Je ne veux pas utiliser xaml.load aussi .. y a-t-il un autre moyen de le résoudre? – curiosity

+0

ne fonctionne pas sur wp7 non plus ... – swinefeaster

+1

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

-2

Eh bien, en effet, nous avons encore une autre façon, vous allez vraiment aimer si vous n'aimez pas ces choses FrameworkElementFactory choses.

Et je pense qu'il est tout simplement des modifications mineures au code naturel, c'est-à, déclarer une UserControl et de mettre votre commande en elle, puis, utiliser un seul FrameworkElementFactory pour appeler le UserControl.

Code de démonstration simple (en F #):

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) 
Questions connexes