如何在Windows Phone 7中以编程方式创建ListBox.ItemTemplate和DataTemplate?

6
我发现在.xaml文件中,listbox有一些item templates、data templates和binding。有没有办法在代码后台中创建它们?
有没有办法以编程方式创建数据模板?
这是XAML代码,但我需要在代码后台中使用C#而不是XAML,因为我正在动态创建列表框并添加项模板、数据模板。
<ListBox Height="520" HorizontalAlignment="Left" Margin="0,6,0,0" Name="lstimge" VerticalAlignment="Top" Width="450" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image  Source="{Binding Image}" Width="150" Stretch="Uniform" HorizontalAlignment="Center" />
                            <TextBlock Text="{Binding FileName}" TextWrapping="Wrap" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

请给出解决方案。

谢谢, Ashok


也许您可以详细说明为什么希望这样做?总的来说,MVVM 的概念是能够定义视图而不需要任何代码。 - RedDeckWins
请将上面编辑过的问题标签查看。 - Ash
对这个非常好的问题点赞。我绝对无法理解为什么微软会厌恶写得好、运行快、类型强的代码,并且提供很好的 IDE 支持,而是强制我们使用某种设计模式,在封闭的沙盒中进行操作,遵守他们的样式指南,现在还要用这些臃肿和不灵活的 XML 文件来骚扰我们。 - UnclePaul
3个回答

5

你无法从代码中构建模板 - 只能从XAML中完成。

如果您在代码中动态生成了模板XAML,则可以按照此处所述进行加载。

我怀疑如果您选择这条路,您会发现自己打开了一个潘多拉魔盒。作为替代方案,您可以预定义一组模板,并在运行时动态选择正确的模板,如此处所述。


@ Damian Mehers:除了使用XMAL和数据模板之外,还有其他动态创建列表框的方法吗? - Asta ni enohpi
var listBox = new ListBox { ItemsSource = Assembly.GetCallingAssembly().GetTypes() };LayoutRoot.Children.Add(listBox); - Damian

5
你可以使用 XamlReader.Load 在代码后台动态加载XAML,并将其转换为DataTemplate,然后将其分配给ItemTemplate。 这里 有一个例子。

@ Dennis Delimarsky:除了使用数据模板,还有其他动态创建列表框的方法吗(不使用XMAL)... - Asta ni enohpi
您可以动态创建ListBox并将其添加到可视树中。对于模板,您需要依赖XAML。 - Den

1

您想要使用的DataTemplate是所有ListBox都相同的,还是也是动态生成的?如果它对于所有ListBox都是相同的,那么您可以将其保存为{{link1:资源中的样式}},然后只需动态创建ListBox对象并应用该样式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接