从c#代码中添加ListBox到DataTemplate

本文关键字:ListBox DataTemplate 添加 代码 | 更新日期: 2023-09-27 17:54:10

我正在尝试动态添加HubSections (c#代码)-这是有效的。
然后,从相同的代码,我想添加列表框的每一个-显然,我不知道如何做到这一点。

我发现了几个例子,比如添加:

ContentTemplate = new DataTemplate() { VisualTree = ... }

…在DataTemplate中没有VisualTree

请询问任何细节,如果我的问题描述太模糊-我是一个WP8.1新手,所以我可以跳过一些重要的信息。

从c#代码中添加ListBox到DataTemplate

我发现最好的方法是这样创建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;
}