2015-02-28 2 views
1

Я хочу показать список в приложении Windows Phone 8.1. Я добавил listview и создал шаблон элемента.windows phone 8.1 listview с шаблоном товара

<ListView x:Name="history" HorizontalAlignment="Left" Height="397" VerticalAlignment="Top" Width="381"> 
        <ListView.Resources> 
         <DataTemplate x:Key="myCell"> 
          <Grid x:Name="myGrid" Height="161" Width="389"> 
           <TextBlock x:Name="title" HorizontalAlignment="Left" Margin="34,13,0,0" TextWrapping="Wrap" Text="Title" VerticalAlignment="Top" Height="52" Width="170" FontSize="48"/> 
           <TextBlock x:Name="content" HorizontalAlignment="Left" Margin="34,70,0,0" TextWrapping="Wrap" Text="content" VerticalAlignment="Top" Height="81" Width="345" FontSize="36"/> 
          </Grid> 
         </DataTemplate> 
        </ListView.Resources> 
        <ListView.ItemTemplate> 
         <StaticResource ResourceKey="myCell"/> 
        </ListView.ItemTemplate> 
       </ListView> 

Я хочу добавить элементы программно. Что-то вроде этого

myCell mm = new myCell(); 
mm.title.Text = "title"; 
mm.content.Text = "content"; 
history.Items.Add(mm); 

Но я не могу получить доступ к myCell. Кто-нибудь может мне помочь?

ответ

2

Поскольку вы используете ItemTemplate, вам нужно создать и добавить элементы в ListView с помощью модели.

public class MyModel 
{ 
    public string title {get; set;} 
    public string content {get; set;} 
} 

А затем добавить элементы так же, как это:

var item = new MyModel(); 
item.title = "some title"; 
item.content = "some content"; 

history.Add(item); 

EDIT

На самом деле лучший способ создать ObservableCollection<T> и установить его в качестве ItemsSource из вас ListView где-то в коде. Например, вы можете использовать Loaded событие вашей ListView:

history_Loaded(object sender, RoutedEventArgs e) 
{ 
    var historyCollection = new ObservableCollection<MyModel>(); 
    history.ItemsSource = historyCollection; 
} 

Затем просто добавить элементы к этому ObservableCollection, и они будут отображаться как он сообщит ListView, когда он будет изменен.

И ваш TextBlock должен определить Text свойство через связывание:

<TextBlock Text="{Binding title}"/> 

Чтобы узнать больше о ObservableCollection<T> и его отличие от List<T> вы можете прочитать - http://www.codeproject.com/Articles/42536/List-vs-ObservableCollection-vs-INotifyPropertyCha.

+0

Спасибо, но когда я добавляю элемент, текст не менялся. Он выглядит как текст статического шаблона –

+0

@ ArnasLiudžius, я бы отредактировал мой ответ, чтобы включить решение для отображения новых элементов. – khamitimur

+0

Я ценю ваш ответ, но текст все еще не меняется. Item.title и контент, не ссылающийся на текстовые блоки, созданные мной в шаблоне (я думаю, так) –

0

Связывание данных имеет два конца: вам необходимо предоставить данные в коде позади, и вам необходимо привязать его к Xaml. Если вы делаете только одно, то соединение отсутствует.

Чтобы предоставить данные из кода, вам необходимо создать коллекцию объектов данных и поместить его в контекст, который может видеть ListView. Мы можем либо установить это непосредственно в ItemsSource ListView, либо мы можем привязать ItemSource к DataContext ListView. Где вы выбираете, зависит от того, насколько вы хотите, чтобы эти данные были доступны. Часто вы будете установить один общий DataContext для страницы, и пусть ListView привязки к подмножеству, но для простоты давайте просто установить его в ListView в DataContext:

class myCell 
{ 
    public string Title { get; set; } 
    public string Content { get; set; } 
} 

public sealed partial class MainPage : Page 
{ 
    // Create a collection of myCells. ObservableCollection will fire 
    // change notifications so we can add new cells later and the binding 
    // will update 
    ObservableCollection<myCell> myCells = new ObservableCollection<myCell>(); 
    public MainPage() 
    { 
     this.InitializeComponent(); 

     this.NavigationCacheMode = NavigationCacheMode.Required; 

     // Generate some dummy data 
     for (int i=0;i<100;i++) 
     { 
      myCells.Add(new myCell() { Title = "Cell " + i, Content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." }); 
     } 

     // Set the cells to the Page's DataContext. All controls on 
     // the page will inherit this. 
     this.DataContext = myCells; 
    } 
} 

После того, как у нас есть данные, мы должны связываться это из Xaml. В существующем шаблоне есть TextBlocks для заголовка и содержимого, но он явно задает свойства Text, а не привязывается к перечисленным объектам. Чтобы исправить это, нам нужно изменить свойства TextBlocks Text для привязки к заголовку и контексту элемента, представленного шаблоном. Оригинальный шаблон был слишком велик, чтобы хорошо вписаться, поэтому я немного его реорганизовал. Отметим также ItemsTemplate = {Binding} дополнение к ListView:

<ListView x:Name="history" ItemsSource="{Binding}"> 
    <ListView.Resources> 
     <DataTemplate x:Key="myCell"> 
      <StackPanel> 
       <TextBlock x:Name="title" HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Title, Mode=OneTime}" VerticalAlignment="Top" Style="{StaticResource TitleTextBlockStyle}" /> 
       <TextBlock x:Name="content" HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Content, Mode=OneTime}" VerticalAlignment="Top" Style="{StaticResource BodyTextBlockStyle}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.Resources> 
    <ListView.ItemTemplate> 
     <StaticResource ResourceKey="myCell"/> 
    </ListView.ItemTemplate> 
</ListView> 

Для получения дополнительной информации см Data binding overview (XAML) на MSDN, в частности, в разделе Binding to Collections.

+0

Спасибо за ваш ответ :) –

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