Привязка содержимого ScrollView - PullRequest
0 голосов
/ 03 сентября 2018

Я хочу динамически связать содержимое ScrollView с формой класса ViewModel.

У меня есть код xaml:

<ScrollView
   Grid.Column="1"
   Content="{Binding UserGrid}"
   HorizontalScrollBarVisibility="Never"
   IsEnabled="False"
   Orientation="Horizontal">
</ScrollView>

и код ViewModel

class ViewModel : BaseViewModel{
    private Grid _userGrid { get; set; }
    public Grid UserGrid
    {
        get { return _userGrid; }
        set        
        {
            _userGrid = value;
            OnPropertyChanged();

        }
    }
    public override async Task InitAsync()
    {
        await Task.Factory.StartNew(() =>
        {
            _userGrid = new Grid
            {
                ColumnSpacing = 1,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand
            };
            _userGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(GridHeightSize * 4) });
// and adding some content to This grid
         }
     }

Конечно, я инициализировал контекст привязки в классе View

У меня вопрос, возможно ли связать это динамически, используя эту привязку контента. В настоящее время я получаю сообщение об ошибке:

,, Не найдено ни свойства, ни привязываемого свойства, ни события для «Содержимого» или несоответствующего типа между значением и свойством "

Если это неправильный способ динамического связывания представления, то что это?

1 Ответ

0 голосов
/ 04 сентября 2018

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

Что вы можете сделать:

  1. Создайте новый класс модели, который содержит все данные, которые вы хотите отобразить в этом представлении прокрутки, для дальнейшего использования я называю его «CardViewModel».
  2. Добавьте свойство List CardViewData в вашу ViewModel
  3. Удалите задачу InitAsync из вашей ViewModel
  4. Убедитесь, что обе модели представлений реализуют интерфейс INotifyPropertyChanged

Теперь в представлении, потребляющем вашу ViewModel, перегрузите конструктор, чтобы принять вашу модель представления в качестве параметра. Внутри конструктора вы перебираете элементы в списке CardViewModel и создаете Grid для каждого элемента.

public TimeTableView(ViewModel model)
{
    foreach (CardViewModel cardModel in CardViewData)
    {
        CardView view = new CardView(cardModel);
        Container.Children.Add(view);
    }
}

Обратите внимание, что "Контейнер" является заполнителем для элемента, содержащего просмотры карт.

На самом деле, я бы посоветовал вам реализовать пользовательское представление, которое содержит все элементы для отображения данных вашей CardViewModel, чтобы вы могли установить контекст привязки пользовательского представления для вашей модели CardView:

public class CardView : Grid
{
    public CardView(CardViewModel model)
    {
        BindingContext = model;
    }
}

Также ScrollView может содержать только один элемент, поэтому вы не можете просто добавить в него несколько элементов. Вам, вероятно, нужно поместить сетку в нее, а затем добавить CardViews к этой сетке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...