2016-10-12 4 views
0

Я пытаюсь создать связанный ListView в Xamarin. Вот # код C:ListView ItemsSource привязка не отображает элементы

public partial class LearnPage : ContentPage 
{ 
    public class TodoItem 
    { 
     public string DisplayName { get; set; } 
    } 

    //ObservableCollection<TodoItem> Items = new ObservableCollection<TodoItem>(); 
    private IEnumerable<TodoItem> _items; 
    public IEnumerable<TodoItem> Items 
    { 
     get { return _items; } 
     set 
     { 
      if (Equals(_items, value)) 
       return; 
      _items = value; 
      OnPropertyChanged(); 
     } 
    } 

    public LearnPage() 
    { 
     InitializeComponent(); 
     BindingContext = this; 
     Items = new TodoItem[]{ 
      new TodoItem{ DisplayName = "Milk cartons are recyclable" } 
     }; 
     //Items.Add(new TodoItem { DisplayName = "Milk cartons are recyclable" }); 
    } 
} 

Вы также можете увидеть некоторые закомментирована код с ObervableCollection, который я также попытался с.

А вот XAML:

<?xml version="1.0" encoding="UTF-8"?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="learn.LearnPage"> 
<ContentPage.Content> 
    <StackLayout VerticalOptions="FillAndExpand" Padding="0,10,0,10"> 
     <ListView ItemsSource="{Binding Items}" RowHeight="40" x:Name="sarasas"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <TextCell Text="{Binding DisplayName}" /> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </StackLayout> 
</ContentPage.Content> 

Когда я построить приложение, отображается пустой список. Я действительно новичок в Xamarin, и я думаю, что я просто пропустил что-то очевидное. Любая помощь ценится!

+0

Это случилось со мной, и я попытался назначить в список п другой способ попробовать это: список уаг = новый TodoItem [] { новый TodoItem {DisplayName = «Milk коробки подлежат вторичной переработке "} }; Items = list; Посмотрите, помогает ли это –

+0

Спасибо за отзыв, однако проблема не устранена. – eksponente

ответ

1

Я не уверен, что ContentPage использует [CallerMemberName] для метода OnPropertyChanged(). Поэтому сначала попробую написать OnPropertyChanged("Items").

В любом случае, если бы я был вами, я бы разделил проблемы и переместил Предметы в класс ViewModel, который реализует сам INotifyPropertyChanged. Это поможет позже, если вы хотите протестировать, добавить больше кода, например, команды, ввести зависимости и т. Д., Где вы оставите код ViewModel отдельно от кода просмотра.

Таким образом, вы могли бы начать с:

public abstract class BaseViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged ([CallerMemberName]string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs (propertyName)); 
    } 
} 

Затем создайте свой ViewModel:

public class LearnViewModel : BaseViewModel 
{ 
    public ObservableCollection<TodoItem> Items { get; } = new ObservableCollection<TodoItem>(); 

    private ICommand _addTodoItem; 
    public ICommand AddTodoItem => 
     _addTodoItem = _addTodoItem ?? new Command(DoAddTodoItem); 

    private int _count; 
    private void DoAddTodoItem() 
    { 
     var item = new TodoItem { DisplayName = $"Item {++_count}" }; 
     // NotifyCollectionChanged must happen on UI thread. 
     Device.BeginInvokeOnMainThread (() => { 
      Items.Add(item); 
     }); 
    } 
} 

Тогда вы можете сохранить свой вид кода тонкий, как:

public partial class LearnPage : ContentPage 
{ 
    public LearnPage() 
    { 
     InitializeComponent(); 
     BindingContext = new LearnViewModel(); 
    } 
} 

Обычно вы бы вызвать команда для заполнения Items в вашей ViewModel, это может быть путем выборки данных из Inte RNET или загрузка локальных данных из базы данных и т.д.

В данном примере вы можете просто добавить конструктор к LearnViewModel и вызвать DoAddTodoItem пару раз:

public class LearnViewModel : BaseViewModel 
{ 
    public LearnViewModel() 
    { 
     DoAddTodoItem(); 
     DoAddTodoItem(); 
    } 
    ... 

Это должно показать вам что-то вроде этого, когда вы запускаете приложение:

enter image description here

+1

Использует '[CallerMemberName]' https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Core/BindableObject.cs#L133 –

+0

Спасибо за ответ, это очень сложно. Мне придется потратить некоторое время на понимание этого - так как есть некоторые неизвестные синтаксис и трюки. Я вернусь к вам, если у меня появятся дополнительные вопросы или вы не сможете заставить их работать! – eksponente

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