从c#代码中添加ListBox到DataTemplate
本文关键字:ListBox DataTemplate 添加 代码 | 更新日期: 2023-09-27 17:54:10
我正在尝试动态添加HubSections (c#代码)-这是有效的。
然后,从相同的代码,我想添加列表框的每一个-显然,我不知道如何做到这一点。
我发现了几个例子,比如添加:
ContentTemplate = new DataTemplate() { VisualTree = ... }
…在DataTemplate中没有VisualTree
请询问任何细节,如果我的问题描述太模糊-我是一个WP8.1新手,所以我可以跳过一些重要的信息。
我发现最好的方法是这样创建DataTemplate:
public class ViewSection : HubSection {
public ViewSection(View view) {
string xaml = "<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'><StackPanel /></DataTemplate>";
ContentTemplate = XamlReader.Load(xaml) as DataTemplate;
this.Loaded += ViewSection_Loaded;
}
private void ViewSection_Loaded(object sender, RoutedEventArgs e) {
base.OnApplyTemplate();
StackPanel stackPanel = findStackPanelInSubtree(this);
...
< adding stuff to stack panel >
...
this.Loaded -= ViewSection_Loaded;
}
private StackPanel findStackPanelInSubtree(FrameworkElement element) {
if (element != null) {
if (element.GetType() == typeof(StackPanel)) {
return element as StackPanel;
}
foreach (FrameworkElement child in getChildren(element)*) {
StackPanel result = findStackPanelInSubtree(child);
if (result != null) return result;
}
}
return null;
}
private List<FrameworkElement> getChildren(FrameworkElement element)* {
if (element != null) {
List<FrameworkElement> result = new List<FrameworkElement>();
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++) {
result.Add(VisualTreeHelper.GetChild(element, i) as FrameworkElement);
}
return result;
}
return null;
}
}
这是微软开发者的残酷玩笑还是有更好的方法?
*当然这是完全多余的,但是foreach使得
不可用的整个子集合看起来不太方便。然而,您可以重写您的方便getChildren
方法来展示yield
关键字的使用:
private List<FrameworkElement> getChildren(FrameworkElement element) {
if (element != null) {
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++) {
yield return (VisualTreeHelper.GetChild(element, i) as FrameworkElement);
}
}
yield break;
}