¿Cómo construyo un DataTemplate en el código c #?

Estoy intentando crear una lista desplegable para una interoperabilidad winform, y estoy creando el menú desplegable en el código. Sin embargo, tengo problemas para vincular los datos según el DataTemplate que especifico.

¿Qué me estoy perdiendo?

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; 

Suponiendo que ya ha configurado ItemsSource etc. para 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; 

Puede usar la misma manera que he configurado la ToolTip sobre ToolTip en los TextBlock para establecer otras propiedades, como los márgenes.

Bueno, de hecho todavía tenemos otra forma, realmente te gustará si no te gustan las cosas de FrameworkElementFactory .

Y creo que solo hace pequeños cambios en el código natural, es decir, declara un UserControl y pone su control en él, y luego, usa solo FrameworkElementFactory para llamar al UserControl .

Código de demostración simple (en F #):

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