views:

6453

answers:

3

I am trying to build a dropdown list for a winform interop, and I am building the dropdown in code. However, I am having 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;
+9  A: 

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.

Hope that helps!

Donnelle
A: 

Your rule. Thanks....

Now, I need to create an account so I can vote you up. :)

A: 

I'm using Silverlight 4, and I don't have access to the DataTemplate.VisualTree Property.

Is there another way of doing this?

Michael