Как привязать сетку данных в ViewCell - PullRequest
0 голосов
/ 21 сентября 2018

Я реализую сетку данных с бесконечной прокруткой, для этого я добавляю свою сетку данных в ListView ViewCell. Мой xaml похож на

 <ListView ItemsSource="{Binding Items}" CachingStrategy="RecycleElement" HasUnevenRows="True">
            <ListView.Behaviors>
                <extended:InfiniteScrollBehavior IsLoadingMore="{Binding IsBusy}" />
            </ListView.Behaviors>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <datagrid:DataGrid ItemsSource="{Binding Items}" Margin="5" RowHeight="30" HeaderHeight="30" BorderColor="#CCCCCC" HeaderBackground="#5b9bd5" HeaderTextColor="White">
                            <datagrid:DataGrid.Columns>
                                <datagrid:DataGridColumn Title="Job#" PropertyName="Job" Width="0.5*"/>
                                <datagrid:DataGridColumn Title="Source" PropertyName="Source" Width="0.5*"/>
                                <datagrid:DataGridColumn Title="Location" PropertyName="Location"  Width="0.5*"/>
                                <datagrid:DataGridColumn Title="Service" PropertyName="Service"  Width="0.5*"/>
                                <datagrid:DataGridColumn Title="Assignee" PropertyName="Assignee"  Width="0.5*"/>
                                <datagrid:DataGridColumn Title="Service Date" PropertyName="ServiceDate" Width="0.5*"/>
                                <datagrid:DataGridColumn Title="Time Slot" PropertyName="TimeSlot" Width="0.5*"/>
                                <datagrid:DataGridColumn Title="Service Status" PropertyName="ServiceStatus" Width="0.5*"/>
                            </datagrid:DataGrid.Columns>
                            <datagrid:DataGrid.RowsBackgroundColorPalette>
                                <datagrid:PaletteCollection>
                                    <Color>#d2deef</Color>
                                    <Color>#eaeff7</Color>
                                </datagrid:PaletteCollection>
                            </datagrid:DataGrid.RowsBackgroundColorPalette>
                        </datagrid:DataGrid>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
            <ListView.Footer>
                <Grid Padding="6" IsVisible="{Binding IsBusy}">
                    <Grid.Triggers>
                        <Trigger TargetType="Grid" Property="IsVisible" Value="False">
                            <Setter Property="HeightRequest" Value="0" />
                        </Trigger>
                    </Grid.Triggers>
                    <Label Text="Loading..." TextColor="DeepPink" FontSize="20" FontAttributes="Bold" VerticalOptions="Center" HorizontalOptions="Center" />
                </Grid>
            </ListView.Footer>
        </ListView>

, а моя ViewModel похожа на

public class MainViewModel : INotifyPropertyChanged
{
    private bool _isBusy;
    private const int PageSize = 25;
    public InfiniteScrollCollection<Jobs> Items { get; }

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


    #region fields
    private List<Jobs> jobs;
    private Jobs selectedItem;
    private bool isRefreshing;
    #endregion

    #region Properties
    public List<Jobs> Jobs
    {
        get { return jobs; }
        set { jobs = value; OnPropertyChanged(nameof(jobs)); }
    }

    public Jobs SelectedJob
    {
        get { return selectedItem; }
        set
        {
            selectedItem = value;
            System.Diagnostics.Debug.WriteLine("Job Selected : " + value?.Job);
        }
    }

    public bool IsRefreshing
    {
        get { return isRefreshing; }
        set { isRefreshing = value; OnPropertyChanged(nameof(IsRefreshing)); }
    }

    public ICommand RefreshCommand { get; set; }
    #endregion

    public MainViewModel()
    {
        Jobs = new List<Jobs>();
        for (int i = 0; i <= 1000; i++)
        {
            Jobs.Add(new Jobs { Job = i, Source = "Source" + i, Location = "Loaction" + i, Service = "Service" + i, Assignee = "Assignee" + i, ServiceDate = "ServiceDate" + i, TimeSlot = "TimeSlot" + i, ServiceStatus = "ServiceStatus" + i });
        }

        Items = new InfiniteScrollCollection<Jobs>
        {
            OnLoadMore = async () =>
            {
                IsBusy = true;

                // load the next page
                var page = Items.Count / PageSize;

                var items = await GetItemsAsync(page, PageSize);

                IsBusy = false;

                // return the items that need to be added
                return items;
            },
            OnCanLoadMore = () =>
            {
                return Items.Count < Jobs.Count;
            }
        };

        DownloadDataAsync();
    }

    private async Task DownloadDataAsync()
    {
        var items = await GetItemsAsync(pageIndex: 0, pageSize: PageSize);

        Items.AddRange(items);
    }
    public async Task<List<Jobs>> GetItemsAsync(int pageIndex, int pageSize)
    {
        await Task.Delay(5000);

        return Jobs.Skip(pageIndex * pageSize).Take(pageSize).ToList();
    }

    private async void CmdRefresh()
    {
        IsRefreshing = true;
        // wait 3 secs for demo
        await Task.Delay(3000);
        IsRefreshing = false;
    }

    #region INotifyPropertyChanged implementation
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }

    #endregion
}

Каждый раз, когда моя ячейка показывает 25 элементов в ячейке. Может кто-нибудь помочь мне, как загрузить данные только в одну ячейку и каждый раз добавлять дополнительные данные ниже предыдущих данных.

1 Ответ

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

дайте вашему ListView имя и измените

<datagrid:DataGrid ItemsSource="{Binding Path=BindingContext, Source={x:Reference Name=<NameOfListView>}}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...