创建后面的datatemplate代码

我正在尝试为show数据创建一个ListBox视图,我希望它包含一个带有2列数据模板的ListBox“产品ID和产品条形码”

我想用纯C#代码创建它,或者如果可能的话通过xaml加载它? 如果我可以创建一个模板,我可以使用c#作为各种资源。

到目前为止我所做的是:在XAML中:

          

在代码背后:

 string typedString = txtCAuto.Text.ToUpper(); List autoList = new List(); autoList.Clear(); prodDetails ps = SelProd4Sale(); foreach (string item in ps.ProdBrcdList) { if (!string.IsNullOrEmpty(txtCAuto.Text)) { if (item.StartsWith(typedString)) { //autoList.Add(item); FrameworkElementFactory colProdID = new FrameworkElementFactory(typeof(TextBlock)); Binding prodID = new Binding(ps.ProdIDList.ToString()); colProdID.SetBinding(TextBlock.TextProperty, prodID); FrameworkElementFactory colProdBarcode = new FrameworkElementFactory(typeof(TextBlock)); Binding prodBarcode = new Binding(); prodBarcode.Path = new PropertyPath(ps.ProdBrcdList.ToString()); colProdBarcode.SetBinding(TextBlock.TextProperty, prodBarcode); FrameworkElementFactory sb = new FrameworkElementFactory(typeof(StackPanel)); sb.AppendChild(colProdID); sb.AppendChild(colProdBarcode); dTemplate = new DataTemplate { VisualTree = sb }; dTemplate.Seal(); } } } if (autoList.Count > 0) { lbSuggestion.ItemTemplate = dTemplate; //lbSuggestion.ItemsSource = autoList; lbSuggestion.Visibility = Visibility.Visible; } else if (txtCAuto.Text.Equals("")) { lbSuggestion.Visibility = Visibility.Collapsed; lbSuggestion.ItemsSource = null; } else { lbSuggestion.Visibility = Visibility.Collapsed; lbSuggestion.ItemsSource = null; } 

但是没有数据显示,请提出任何建议。 谢谢,

您可以在xaml中定义资源,如果它定义了x:Key则在代码后面检索它。

在你的xaml中:

 ... 

在您的代码背后:

 var dataTemplate = Application.Current.TryFindResource("anyId") as DataTemplate; 

要么

 var dataTemplate = Application.Current.FindResource("anyId") as DataTemplate; 

我已经像这样创建了DataTemplate:

 private DataTemplate getDataTemplate() { DataTemplate retVal = null; String markup = String.Empty; markup = ""; markup += ""; markup += ""; markup += ""; markup += ""; retVal = (DataTemplate)XamlReader.Load(markup); return retVal; } 

…然后在需要的地方调用此方法(如OnApplyTemplate)

 this.ContentTemplate = getDataTemplate(); 

注意:您可能必须更改WPF的“xmlns”,因为此示例来自我的一个Silverlight项目。 但这个想法是一样的。

条件XAML DataTemplate

在对象的XAML文件中定义静态DataTemplate是解决此问题的常用方法。 此外,Microsoft提供的示例DataTemplate.LoadContent()非常适合显示如何在运行时动态切换模板(请参阅DataTemplate.LoadContent方法 )。

但是,如果您对条件XAML编译有特殊要求(比如在构建发行版时省略仅调试XAML),则需要采用XamlReader.Load()方法(请参阅XamlReader.Load方法 )。

为此,我认为更详细的例子可能会有所帮助。 在这里,我有一个仅调试的ListView,它绑定到自定义对象的ObservableCollection <>。 ListView没有在静态XAML中定义,因为它仅在调试模式下需要…


自定义类:

  class ActiveNotification { public String Name { get; set; } public String Type { get; set; } public String DayOfWeek { get; set; } public DateTime DeliveryTime { get; set; } public String Id { get; set; } } 

私有成员变量:

  readonly ObservableCollection _activeNotifications = new ObservableCollection(); readonly ListView listViewNotifications = new ListView { Visibility = Visibility.Collapsed, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Bottom, }; 

加载时ListView设置:

  // Set up notifications list listViewNotifications.SetBinding(ListView.ItemsSourceProperty, new Binding { Source = _activeNotifications }); listViewNotifications.Tapped += listViewNotifications_Tapped; Grid.SetRowSpan(listViewNotifications, 2); Grid.SetColumnSpan(listViewNotifications, 2); var xamlString = "" + "" + "" + "" + "" + "" + "" + "" + ""; var dataTemplate = (DataTemplate)XamlReader.Load(xamlString); listViewNotifications.ItemTemplate = dataTemplate; GridMain.Children.Add(listViewNotifications); 

希望这可以帮助!

标记