Невозможно отобразить результат привязки MVAM форм Xamarin в виде списка

Я пытаюсь реализовать подход MVVM в моем приложении форм xamarin. Во время реализации я столкнулся с дорожным блоком. Я не могу заполнить представление списка данными, которые я получаю с сервера. Я не могу определить проблему обязательности. Пожалуйста, дайте мне знать, где моя ошибка? Что мне не хватает?

Посмотреть код

<?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="Test.Views.SubtaskPage"
             Title="Select Subtask"
             xmlns:viewModels="clr-namespace:Test.ViewModels; assembly=Test">
    <ContentPage.BindingContext>
        <viewModels:SubtaskPageViewModel/>
    </ContentPage.BindingContext>
    <ContentPage.ToolbarItems>
        <ToolbarItem x:Name="tbiAddSubtask" Text="Add Subtask" Clicked="tbiAddSubtask_Clicked"/>
    </ContentPage.ToolbarItems>
    <StackLayout Orientation="Vertical" Padding="10">
        <ListView x:Name="lstSubtasks" ItemSelected="lstSubtasks_ItemSelected" IsPullToRefreshEnabled="True" RefreshCommand="{Binding RefreshCommand}" IsRefreshing="{Binding IsBusy}" ItemsSource="{Binding SubtaskList}}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <ViewCell.ContextActions>
                            <MenuItem x:Name="menuAddTimeSpent" Clicked="menuItem_Clicked" CommandParameter="{Binding Ticket}" Text="Menu" />
                        </ViewCell.ContextActions>
                        <StackLayout Padding="20,0,0,0" HorizontalOptions="StartAndExpand" Orientation="Horizontal">
                            <Label Text="{Binding Subject}" VerticalTextAlignment="Center" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage>

Код класса ответа

public class SubtasksResponse
    {
        public int Status { get; set; }
        public string Message { get; set; }
        public List<Ticket> Subtasks { get; set; }
    }

Посмотреть код модели

public class SubtaskPageViewModel : INotifyPropertyChanged
{
    private SubtasksResponse _subtaskList;
    public SubtasksResponse SubtaskList
    {
        get { return _subtaskList; }
        set
        {
            _subtaskList = value;
            OnPropertyChanged(nameof(SubtaskList));
        }
    }

    private Command _refreshCommand;
    public Command RefreshCommand
    {
        get
        {
            return _refreshCommand;
        }
    }

    bool _isBusy;

    public bool IsBusy
    {
        get { return _isBusy; }
        set
        {
            _isBusy = value;
            OnPropertyChanged(nameof(IsBusy));
        }
    }

    public SubtaskPageViewModel()
    {
        _refreshCommand = new Command(RefreshList);
    }

    async void RefreshList()
    {
        SubtaskList = await PopulateSubtaskList();
    }

    async Task<SubtasksResponse> PopulateSubtaskList()
    {
        RestService rs = new RestService();
        IsBusy = true;
        IsBusy = false;
        var subtaskList = new SubtasksResponse();
        subtaskList = await rs.GetSubtasksAsync(Convert.ToInt32(Application.Current.Properties["UserId"]));
        return subtaskList;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

1 ответ

Решение

Для начала мы видим, что вы связываете ListView с ItemsSource="{Binding SubtaskList} - когда мы затем смотрим на ViewModel, кажется, что SubtaskList имеет тип SubtasksResponse, этот тип имеет только 3 свойства.

Но шаблон элемента внутри вашего ListView не использует ни одного из этих 3 свойств... он использует Ticket и Subject. Это свойства класса подзадач? Если это так, вам нужно привязать ListView непосредственно к свойству List, чтобы он мог подобрать элементы в этой коллекции.

Другие вопросы по тегам