2015-02-12 2 views
1

мне нужно сгенерировать listview с данными я имею в arrayГенерирующие элементов в ListView

мой XAML является:

<Page.Resources> 
     <DataTemplate x:Key="IconTextDataTemplate"> 
      <StackPanel Orientation="Horizontal" Width="220" Height="60"> 
       <Border Background="#66727272" Width="40" Height="40" Margin="10"> 
        <Image Source="/SampleImage.png" Height="32" Width="32" Stretch="UniformToFill"/> 
       </Border> 
       <StackPanel Orientation="Vertical" VerticalAlignment="Center"> 
        <TextBlock x:Name="Name" Margin="10,0,0,0" Width="170" Height="20" TextTrimming="WordEllipsis" Loaded="Name_Loaded"/> 
        <TextBlock x:Name="Description" Margin="10,0,0,0" Width="170" Height="20" TextTrimming="WordEllipsis" Loaded="Description_Loaded"/> 
       </StackPanel> 
      </StackPanel> 
     </DataTemplate> 
</Page.Resources> 
<ListView x:Name="IconTextGrid" Height="400" ItemTemplate="{StaticResource IconTextDataTemplate}" Grid.Row="4" Margin="40,40,40,10" HorizontalAlignment="Stretch"> 
        <ListView.ItemsPanel> 
         <ItemsPanelTemplate> 
          <ItemsWrapGrid MaximumRowsOrColumns="8"/> 
         </ItemsPanelTemplate> 
        </ListView.ItemsPanel> 
       </ListView> 

И C# код:

private async void SearchBox_QuerySubmitted(SearchBox sender, SearchBoxQuerySubmittedEventArgs args) 
    { 
     foreach (var item in results) 
     { 
      IconTextGrid.Items.Add(""); 
      nameStr = item.FirstName + " " + item.LastName; 
      descriptionStr = item.Email; 
     } 
    } 


    public T FindElementByName<T>(DependencyObject element, string sChildName) where T : FrameworkElement 
    { 
     T childElement = null; 
     var nChildCount = VisualTreeHelper.GetChildrenCount(element); 
     for (int i = 0; i < nChildCount; i++) 
     { 
      FrameworkElement child = VisualTreeHelper.GetChild(element, i) as FrameworkElement; 

      if (child == null) 
       continue; 

      if (child is T && child.Name.Equals(sChildName)) 
      { 
       childElement = (T)child; 
       break; 
      } 

      childElement = FindElementByName<T>(child, sChildName); 

      if (childElement != null) 
       break; 
     } 
     return childElement; 
    } 

    private void Name_Loaded(object sender, RoutedEventArgs e) 
    { 
     TextBlock Name = FindElementByName<TextBlock>(this, "Name"); 
     Name.Text = nameStr; 
    } 

    private void Description_Loaded(object sender, RoutedEventArgs e) 
    { 
     TextBlock Description = FindElementByName<TextBlock>(this, "Description"); 
     Description.Text = descriptionStr; 
    } 

Этот код должен сгенерируйте представление списка с некоторыми элементами (в размере массива) и поместите в каждый элемент данные из ячейки в массиве. Проблема в том, что только в одном элементе я вижу данные из массива, а в других элементах ничего нет. желание помочь, спасибо

+0

@NextInLine IconTextGrid - это список, в котором отображаются результаты поиска, я вижу правильное количество элементов, но только один элемент хранит данные, остальные пустые, и почему мой вопрос? – Tal

+0

@NextInLine FindElementByName Находит текстовые блоки внутри DataTemplate (они недоступны без этой функции) – Tal

+0

Ах, я пропустил вертикальную полосу прокрутки на фрагменте кода. – NextInLine

ответ

1

Ваш код не удается, по крайней мере, по одной причине:

foreach (var item in results) 
    { 
     IconTextGrid.Items.Add(""); 
     nameStr = item.FirstName + " " + item.LastName; 
     descriptionStr = item.Email; 
    } 

вы, кажется, хранение nameStr и descriptionStr в поля. Но вы сохраняете только последний элемент в результатах.

Хорошая новость заключается в том, что вы можете упростить и исправить свой код сразу. Использование

foreach (var item in results) 
    { 
     var nameStr = item.FirstName + " " + item.LastName; 
     var descriptionStr = item.Email; 
     IconTextGrid.Items.Add(new { Name = nameStr, Description = descriptionStr }); 
    } 

Это будет создавать анонимные типы с Name и Description свойствами для ListView элементов. Затем вы можете использовать:

<DataTemplate x:Key="IconTextDataTemplate"> 
     <StackPanel ...> 
       <Image .../> 
      </Border> 
      <StackPanel ...> 
       <TextBlock Text="{Binding Name}" Margin="10,0,0,0" Width="170" Height="20" TextTrimming="WordEllipsis"/> 
       <TextBlock Text="{Binding Description} Margin="10,0,0,0" Width="170" Height="20" TextTrimming="WordEllipsis"/> 
      </StackPanel> 
     </StackPanel> 
    </DataTemplate> 

И удалить ваши FindElementByName, Name_Loaded и Description_Loaded методы.

+0

Спасибо вам большое! Это потрясающе! – Tal