如何在C#代码中构buildDataTemplate?

我正在尝试构build一个winform互操作的下拉列表,并在代码中创build下拉列表。 但是,我得到的数据绑定基于我指定的DataTemplate的问题。

我错过了什么?

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; 

假设你已经为drpCreditCardNumberWpf设置了ItemsSource等等…

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

您可以使用与TextBlock上的ToolTip相同的方式来设置边距等其他属性。

那么的确,我们还有另外一种方法,如果你不喜欢这些FrameworkElementFactory东西,你就会喜欢它。

我认为这只是对自然代码进行细微的修改,即声明一个UserControl并将其放入其中,然后使用一个FrameworkElementFactory来调用UserControl

简单的演示代码(在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)