2015-03-04 10 views
0

Я использую шаблон приложения 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. Например, если Вариант 1 в Longlistselector имеет 4 элемента, а Вариант 2 имеет шесть элементов, Вариант 2 выглядит отлично, но в Варианте 1 есть много пробелов в конце (возможно, выходящие из данных нет для Терминала 5 и Терминала 6). Если есть еще один вариант 3, состоящий всего из 1 элемента, вся подробная информация содержит много пробелов после отображения отдельного элемента. В некоторых вариантах у меня есть более 100 элементов, а лишние лишние пробелы в конце DetailPage просто раздражают. Я хотел бы знать, есть ли способ генерировать форматированные текстовые блоки вместе с привязанными ресурсами в DetailPage динамически, чтобы можно было удалить лишние пробелы? Если нет, как я могу показать только требуемые текстовые блоки для данного параметра?

Update: Это как данные загружены в текстовых блоков:

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" 

}); 

Если я выбираю любую TextBlock, я буду получать термины и определения, указанные в соответствующем идентификатору Texblock. Если я выберу первый Textblock, я получу Условия/определения 1, 2, 3, 4, 5. Если я выберу другой текстовый блок, я получу только один термин/определение.

Вот как это точно происходит на выходе. Проблема в том, что Textblock для терминов 2, 3, 4, 5 и 6 вводит пробелы, если для этого идентификатора нет условий для отображения. Итак, пустые текстовые блоки съедают пробелы на экране. Я хотел бы, чтобы на странице сведений отображались только текстовые блоки, которые применимы для идентификатора, а затем прекратить их создание для остальных блоков для этого идентификатора.

+0

Можете ли вы добавить дополнительный код и xaml, возможно, с некоторыми скриншотами, что пойдет не так и как вы хотите? Описание проблемы намекает на «DataTemplate» как часть ответа, но в этой очень сжатой форме очень сложно понять, что именно вы хотите. –

+0

@WillemvanRumpt: добавлено больше информации о проблеме – Aiseduk

+0

Я могу видеть, куда вы направляетесь, и какова ваша проблема, но она слишком велика, чтобы объяснять в разумном ответе, поэтому я оставлю некоторые подсказки в качестве комментария : Вместо определения «Term_1» через «Term_2» в качестве фиксированных свойств, определите их как одно свойство List-of-Term на ItemViewModel, содержащее столько «Условий», сколько вам нужно. Затем вы можете связать этот список с ItemsControl, который займет столько места, сколько нужно для отображения элементов. Поэтому вместо предварительного определения шести текстовых блоков вы можете использовать ListView (или что-то в этом роде) и привязываться к списку терминов. –

ответ

0

Вместо определения «Term_1» через «Term_2» как свойства на ItemViewModel, объявить свойство List на 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 (или что-то си Milar) в XAML и привязать его к свойству терминах ItemViewModel класса:

<!-- 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 по мере необходимости.

+0

Это работало как шарм! Большое спасибо! – Aiseduk

Смежные вопросы