Search code examples
c#wpfdatatemplate

How do I build a DataTemplate in c# code?


I am trying to build a dropdown list for a winform interop, and I am creating the dropdown in code. However, I have a problem getting the data to bind based on the DataTemplate I specify.

What am I missing?

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;

Solution

  • Assuming that you've already set up the ItemsSource etc for 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;
    

    You can use the same way I have set the ToolTip on the TextBlocks to set other properties such as margins.