将列表框从C#代码添加到数据模板

将列表框从C#代码添加到数据模板,c#,.net,windows-phone-8.1,C#,.net,Windows Phone 8.1,我正在尝试动态添加HubbSections(C#代码)-这很有效。 然后从相同的代码中,我想将列表框添加到每个列表框中——显然,我不知道如何做到这一点 我发现了几个例子,如添加: ContentTemplate = new DataTemplate() { VisualTree = ... } 。。。到HubSection构造函数,但DataTemplate中没有VisualTree 如果我的问题描述过于模糊,请询问任何详细信息-我是WP8.1新手,因此可以跳过一些重要信息。我发现的最佳方法是创

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

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

ContentTemplate = new DataTemplate() { VisualTree = ... }
。。。到HubSection构造函数,但DataTemplate中没有VisualTree


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

我发现的最佳方法是创建如下数据模板:

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;
    }
}
公共类视图节:HubSection{
公共视图部分(视图){
字符串xaml=“”;
ContentTemplate=XamlReader.Load(xaml)作为数据模板;
this.Loaded+=ViewSection\u Loaded;
}
已加载私有void ViewSection_(对象发送器、路由目标){
base.OnApplyTemplate();
StackPanel StackPanel=findStackPanelInSubtree(此);
...
<向堆栈面板添加内容>
...
this.Loaded-=ViewSection\u Loaded;
}
专用StackPanel findStackPanelInSubtree(FrameworkElement元素){
if(元素!=null){
if(element.GetType()==typeof(StackPanel)){
返回元件如StackPanel;
}
foreach(getChildren(元素)*中的FrameworkElement子元素){
StackPanel结果=findStackPanelInSubtree(子级);
if(result!=null)返回结果;
}
}
返回null;
}
私有列表getChildren(FrameworkElement元素)*{
if(元素!=null){
列表结果=新列表();
for(int i=0;i
这是微软开发人员开的一个残酷的玩笑还是有更好的方法


*当然,这是完全多余的,但是foreach让阅读变得更好了。整个儿童收藏的不可用性看起来并不方便。但是,您可以重写handy
getChildren
方法来展示关键字用法:

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;
}
私有列表getChildren(FrameworkElement){ if(元素!=null){ for(int i=0;i是。。。我可以使用一些C#for Java开发者课程。