无法在列表视图中显示 Xamarin Forms MVVM 绑定结果

Unable to show Xamarin Forms MVVM binding result in listview

我正在尝试在我的 xamarin 表单应用程序中实施 MVVM 方法。在实施过程中,我遇到了障碍。我无法使用从服务器收到的数据填充列表视图。我无法确定绑定问题。 请让我知道我的错误在哪里?我错过了什么?

查看代码

<?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>

回复Class代码

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));
        }
    }
}

对于初学者,我们看到您将 ListView 绑定到 ItemsSource="{Binding SubtaskList} - 当我们查看 ViewModel 时,SubtaskList 似乎是 SubtasksResponse 类型,该类型只有 3 个属性。

但是您的 ListView 中的项目模板没有使用这 3 个属性中的任何一个...它使用的是 Ticket 和 Subject。 这是 class 子任务的属性吗?如果是这样,您需要将 ListView 直接绑定到列表 属性 以便它选取该集合中的项目。