Связывание данных имеет два конца: вам необходимо предоставить данные в коде позади, и вам необходимо привязать его к 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.
Спасибо, но когда я добавляю элемент, текст не менялся. Он выглядит как текст статического шаблона –
@ ArnasLiudžius, я бы отредактировал мой ответ, чтобы включить решение для отображения новых элементов. – khamitimur
Я ценю ваш ответ, но текст все еще не меняется. Item.title и контент, не ссылающийся на текстовые блоки, созданные мной в шаблоне (я думаю, так) –