动态生成文本块

Dynamically generate textblocks

我正在使用 Windows Phone Panorama App 模板并使用 LongListSelector 允许用户单击并查看长列表中列出的项目的详细信息。 DetailsPage.xaml 中提供了项目的详细信息。 我的代码运行良好,即用户可以跳转到 DetailsPage.xaml 上的正确项目,并且内容对他们可见。

                <!--new text block -->
                <TextBlock Text="{Binding Term_1}" Style="{StaticResource Textblock}" FontWeight="Bold" Foreground="{StaticResource PhoneAccentBrush}"/>
                <TextBlock Text="{Binding Definition_1}" Style="{StaticResource Textblock}"  Margin="10,0,0,20" TextWrapping="Wrap"/>

                <TextBlock Text="{Binding Term_2}" Style="{StaticResource Textblock}" FontWeight="Bold" Foreground="{StaticResource PhoneAccentBrush}"/>
                <TextBlock Text="{Binding Definition_2}" Style="{StaticResource Textblock}" Margin="10,0,0,20"/>

                <TextBlock Text="{Binding Term_3}" Style="{StaticResource Textblock}" FontWeight="Bold" Foreground="{StaticResource PhoneAccentBrush}"/>
                <TextBlock Text="{Binding Definition_3}" Style="{StaticResource Textblock}" Margin="10,0,0,20"/>

                <TextBlock Text="{Binding Term_4}" Style="{StaticResource Textblock}" FontWeight="Bold" Foreground="{StaticResource PhoneAccentBrush}"/>
                <TextBlock Text="{Binding Definition_4}" Style="{StaticResource Textblock}" Margin="10,0,0,20"/>

                <TextBlock Text="{Binding Term_5}" Style="{StaticResource Textblock}" FontWeight="Bold" Foreground="{StaticResource PhoneAccentBrush}"/>
                <TextBlock Text="{Binding Definition_5}" Style="{StaticResource Textblock}" Margin="10,0,0,20"/>

                <TextBlock Text="{Binding Term_6}" Style="{StaticResource Textblock}" FontWeight="Bold" Foreground="{StaticResource PhoneAccentBrush}"/>
                <TextBlock Text="{Binding Definition_6}" Style="{StaticResource Textblock}" Margin="10,0,0,20"/>


我的问题是 DetailsPage.xaml 上的项目是如何显示的。例如,如果 Longlistselector 上的选项 1 有 4 个项目,而选项 2 有 6 个项目,则选项 2 看起来很好,但选项 1 最后有很多空格(可能来自 no data for第 5 学期和第 6 学期)。如果还有另一个选项 3 只有 1 个项目,则整个 DetailsPage 在显示单个项目后包含大量空白。我在某些选项中有 100 多个项目,而 DetailsPage 末尾不需要的额外空格简直令人讨厌。我想知道是否有动态生成格式化的文本块以及 DetailsPage 中的绑定资源,以便可以删除多余的空格?如果没有,我如何才能只显示给定选项所需的文本块?

更新: 这是文本块中数据加载的方式:

public void LoadData()
        {


            this.Items.Add(new ItemViewModel()

{
    ID = "0",
    Term_1 = "This is a term1",
    Definition_1 = "This definition1", 

Term_2 = "This is a term2",
        Definition_2 = "This definition2",

Term_3 = "This is a term3",
        Definition_3 = "This definition3",

Term_4 = "This is a term4",
        Definition_4 = "This definition4",

Term_5 = "This is a term5",
        Definition_5 = "This definition5",

});

this.Items.Add(new ItemViewModel()

{
    ID = "1",`enter code here`
    Term_1 = "This is a term1 for ID 1",
    Definition_1 = "This definition1 for ID 1"

});
this.Items.Add(new ItemViewModel()

{
    ID = "2",
    Term_1 = "This is a term1 for ID 2",
    Definition_1 = "This definition1 for ID 2"

});
this.Items.Add(new ItemViewModel()

{
    ID = "3",
    Term_1 = "This is a term1 for ID 3",
    Definition_1 = "This definition1 for ID 3"

});
this.Items.Add(new ItemViewModel()

{
    ID = "4",
    Term_1 = "This is a term1 for ID 4",
    Definition_1 = "This definition1 for ID 4"

});
this.Items.Add(new ItemViewModel()

{
    ID = "5",
    Term_1 = "This is a term1 for ID 5",
    Definition_1 = "This definition1 for ID 5"

});

this.Items.Add(new ItemViewModel()

{
    ID = "6",
    Term_1 = "This is a term1 for ID 6",
    Definition_1 = "This definition1 for ID 6"

});

如果我 select 任何文本块,我将获得 Texblock 的相应 ID 中列出的术语和定义。如果我 select 第一个文本块,我将得到 Terms/definitions 1、2、3、4、5。如果我 select 另一个文本块,我将只得到一个 term/definition。

这就是它在输出中的确切方式。问题在于,如果该 ID 没有可显示的术语,则术语 2、3、4、5 和 6 的文本块会引入空格。因此,空文本块正在占用屏幕上的空间。我希望详细信息页面仅呈现适用于某个 ID 的 TextBlock,然后停止为该 ID 的剩余块创建它们。

不是将 "Term_1" 到 "Term_2" 定义为 ItemViewModel 上的属性,而是在 ItemViewModel 上声明一个列表 属性(我假设类型为字符串这里):

public class ItemViewModel
{
    // ... other properties
    public List<string> Terms
    {
       get; set; // Implementation ommited
    }
}

ItemViewModel 实例的创建将变成类似

ItemViewModel viewModelItem= new ItemViewModel() { Id = "1", Definition_1 = "..." };
viewModelItem.Terms.Add("Term1 for Id1");
viewModelItem.Terms.Add("Term2 for Id1");
viewModelItem.Terms.Add("Term3 for Id1");
// ...as many terms as you have...
this.Items.Add(viewModelItem);

在您的详细信息页面中,我假设显示一个 ItemViewModel(从 LongListSelector 中选择的一个),您可以在 [=] 中添加一个 ListView(或类似的东西) 32=] 并将其绑定到 ItemViewModel class 的条款 属性:

<!-- Assumes an `ItemViewModel` instance is the `DataContext` for the ListView! -->
<ListView ItemsSource={Binding Terms}>
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text={Binding}/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

ListView 将根据需要生成尽可能多的 ListViewItems