创建后面的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);
希望这可以帮助!
标记