Estoy intentando crear una lista desplegable para una interoperabilidad de winform y estoy creando el menú desplegable en el código. Sin embargo, tengo un problema para que los datos se unan 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;
c#
wpf
datatemplate
Saman Hakimzadeh Abyaneh
fuente
fuente
Load
método de laXamlReader
clase.Respuestas:
Suponiendo que ya ha configurado el
ItemsSource
etc. paradrpCreditCardNumberWpf
...//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 forma en que configuré
ToolTip
laTextBlock
s para establecer otras propiedades, como los márgenes.fuente
La versión completa
var ms = new MemoryStream(Encoding.UTF8.GetBytes(@"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" xmlns:c=""clr-namespace:MyApp.Converters;assembly=MyApp""> <DataTemplate.Resources> <c:MyConverter x:Key=""MyConverter""/> </DataTemplate.Resources> <TextBlock Text=""{Binding ., Converter={StaticResource MyConverter}}""/> </DataTemplate>")); var template = (DataTemplate)XamlReader.Load(ms); var cb = new ComboBox { }; //Set the data template cb.ItemTemplate = template;
fuente
XamlReader.Load
no acepta controladores de eventos.Bueno, de hecho todavía tenemos otra forma, realmente te gustará si no te gustan esas
FrameworkElementFactory
cosas.Y creo que solo hace cambios menores en el código natural, es decir, declara ay
UserControl
pon tu control en él, y luego usa solo unoFrameworkElementFactory
para llamar aUserControl
.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<MyView>) let template=DataTemplate(VisualTree=factory) let list=ItemsControl(ItemsSource=makeData(),ItemTemplate=template)
fuente