Xamarin Forms View отображается только при добавлении в коде дочернего элемента - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть пользовательский вид, который я пытаюсь передать как List<T>. По какой-то причине при попытке загрузить страницу приложение выдает System.ArrayTypeMismatchException.

Вот класс:

public class DiaryCalendarCustomView : View
{
    MiscFunctions misctools = new MiscFunctions();

    private List<DiaryNextContactEventModel> _eventList = new List<DiaryNextContactEventModel>();

    public List<DiaryNextContactEventModel> EventList
    {
        get { return _eventList; }
        set { _eventList = value; }
    }

    public void SetSelectedDate (DateTime selectedDate)
    {
        SelectedDate = selectedDate;

        Settings.Current.NextContactContactDate = selectedDate.ToLocalTime();
    }

    public DateTime SelectedDate { get; set; }

    public DiaryCalendarCustomView()
    {
    }
}

Просмотр модели:

private List<DiaryNextContactEventModel> _eventList = new List<DiaryNextContactEventModel>();

public List<DiaryNextContactEventModel> EventList
{
    get { return _eventList; }
    set { SetProperty(ref _eventList, value); }
}

Когда я добавляю статические данные в объект EventList, он работает нормально, а когда я удаляю Binding из представления XAML, он также работает. Таким образом, проблема заключается в том, что xamarin пытается преобразовать мой список в другой тип перечислимых, и именно здесь он терпит неудачу.

XAML:

<Grid VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
       <Grid.Children>
            <partials:DiaryCalendarCustomView EventList="{Binding EventList}"/>
       </Grid.Children>
 </Grid>

Отладка и поиск не дали ничего полезного. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 30 апреля 2018

Если вы хотите использовать пользовательское свойство в XAML, вам нужно объявить его в своем представлении. Ваш код выглядит нормально, просто следуйте некоторому учебнику, подобному следующему: Создание пользовательских элементов управления с привязываемыми свойствами в Xamarin.Forms и добавьте недостающие фрагменты, таким образом, определение свойства и метод propertyChanged:

public static readonly BindableProperty EventListProperty = BindableProperty.Create(
                                                         propertyName: "EventList",
                                                         returnType: typeof(List<DiaryNextContactEventModel>),
                                                         declaringType: typeof(DiaryCalendarCustomView),
                                                         defaultValue: "",
                                                         defaultBindingMode: BindingMode.TwoWay,
                                                         propertyChanged: EventListPropertyChanged);

, а также:

private static void EventListPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
    var view = (DiaryCalendarCustomView) bindable;
    view.EventList = (List<DiaryNextContactEventModel>) newValue;
}

Также убедитесь, что ваш класс реализует интерфейс INotifyPropertyChanged, поэтому при изменении EventList в EventListPropertyChanged представление будет перезагружено

...