NullReferenceException При связывании List <View>между Control и ViewModel в Xamarin.Forms - PullRequest
0 голосов
/ 09 ноября 2018

У меня проблема с привязкой элементов List of View между control и viewModel.

Я создал ContentView и включил его в ContentPage. Мне нужно создать Grid.Children в ContentView динамически, добавив в Grid список элементов BoxView, созданных в ViewModel.

Мне удалось успешно связать другой элемент управления (например, метку), однако, когда я пытаюсь связать список представлений, я получаю сообщение об ошибке.

Первая ошибка появляется при переходе к ContentPage, содержащему ContentView, страница не загружается, и я получаю:

System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

Ваше приложение вошло в состояние останова, но нет кода для показа, потому что все потоки выполняли внешний код (обычно код системы или фреймворка).

Итак, в этот момент я удалил привязку из элемента управления (разметка внутри XAML ContentPage) и загрузил страницу, но когда я запустил метод, который должен заполнять сетку элемента управления списком, содержащим элементы BoxView, я не смогу пройти Перечислите в Control, так как привязка на данный момент отсутствует.

У меня вопрос: есть ли способ связать Список представлений между ViewModel и ContentView в Xamarin.Forms? Или я пытаюсь сделать что-то, что никогда не сработает?

Как мне обновить сетку ContentView, когда сетка отображается на основе списка представлений, созданного после загрузки ContentPage?

Если вышеприведенное невозможно, создает ли дочерние элементы Grid только при загрузке ContentPage? Можно ли было бы затем передать список представлений в качестве аргумента ContentPage?

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

Я надеюсь, что можно будет отобразить / обновить Грид и его дочерние элементы после фактической загрузки страницы содержимого.

Вот код, который у меня сейчас есть:

Код ContentView за

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class GridView : ContentView
{
    public GridView()
    {
        InitializeComponent();

    }
    public static readonly BindableProperty ViewProperty = BindableProperty.Create(nameof(ViewList), typeof(List<View>), typeof(GridView));

    public List<View> ViewList
    {
        get
        {
            return (List<View>)GetValue(ViewProperty);
        }
        set
        {
            SetValue(ViewProperty, value);
        }
    }
}

ContentView XAML

<AbsoluteLayout>
    <Grid x:Name="RenderedGrid" 
                  x:FieldModifier="public" 
                  ColumnSpacing="1" 
                  AbsoluteLayout.LayoutBounds="0, 0, 1, 1" 
                  AbsoluteLayout.LayoutFlags="All">    
    </Grid>
</AbsoluteLayout>

Код ContentPage позади

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class GridPage : ContentPage
{
    public GridPage ()
    {
        InitializeComponent ();
        BindingContext = new GridPageViewModel(Navigation);

    }
}

Разметка страницы содержания

<ScrollView Grid.Row="1">
        <local:GridView ViewList="{Binding Path=BindingContext.ViewsList, Source={x:Reference GridPage}}"/>
</ScrollView>

Модель представления ContentPage

[XamlCompilation(XamlCompilationOptions.Compile)]
public class GridPageViewModel : BaseGridViewModel
{

    public Classes _Classes;
    public GridView _gridView = new GridView();
    public ICommand RenderGridCommand { get; private set; }

    public GridPageViewModel(INavigation navigation)
    {

        _navigation = navigation;

        RenderGridCommand = new Command(() => StartRender());//used when button is hit, not when page loads.
    }
    public void StartRender()
    {
        CreateGrid();
    }

    public void CreateGrid()
    {
        //List<View> views = new List<View>();

        for (int i = 0; i < SomeProvidedCustomDataList.Count(); i++)
        {
            BoxView boxView = new BoxView
            {
                Color = Color.Accent,
                HeightRequest = SomeProvidedCustomDataList[i].Height,
                VerticalOptions = LayoutOptions.End,
                StyleId = SomeProvidedCustomDataList[i].Name
            };
            boxView.GestureRecognizers.Add(tapGesture);
            ViewsList.Add(boxView);
        }
        //Add list of boxViews to Grid
        _gridView.RenderedGrid.Children.AddHorizontal(_gridView.ViewList);

    }
    List<View> _viewsList = new List<View>();
    public List<View> ViewsList
    {
        get => _viewsList;
        set
        {
            _viewsList = value;
            NotifyPropertyChanged("ViewsList");
        }
    }

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