Asynchronous data loading with Entity Data Source?

2 posts, 0 answers
  1. Samuel
    Samuel avatar
    8 posts
    Member since:
    Jul 2014

    Posted 15 Jul 2015 Link to this post

    I have a GridView where the ItemsSource is bound to the PagedSource property of a DataPager.  The DataPager ItemsSource is bound to an EntityDataSource.  The problem is that this is blocking my UI thread.  The GridView has a "DataLoadMode" property which can be set to Asynchronous... but the pager doesn't.  How would I go about loading the data to the pager asynchronously?  I tried doing this in another thread but I keep getting a cross-thread exception even though I use the dispatcher to set the property to which the pager is bound.

     

    <telerik:RadGridView x:Name="RadGridView1"
                                             Grid.Row="0"
                                             Margin="5,5,5,0"
                                             HorizontalAlignment="Stretch"
                                             VerticalAlignment="Stretch"
                                             AlternateRowBackground="LightBlue"
                                             AlternationCount="2"
                                             AutoGenerateColumns="False"
                                             CanUserDeleteRows="False"
                                             CanUserFreezeColumns="False"
                                             CanUserInsertRows="False"
                                             DataLoadMode="Asynchronous"
                                             GroupRenderMode="Nested"
                                             IsReadOnly="True"
                                             ItemsSource="{Binding ElementName=DataPager1,
                                                                   Path=PagedSource}"
                                             RowIndicatorVisibility="Collapsed"
                                             ShowGroupPanel="False"
                                             telerik:StyleManager.Theme="Summer">
                            <telerik:RadGridView.Columns>
     
                                <telerik:GridViewDataColumn Width="60"
                                                            DataMemberBinding="{Binding StoreNumber}"
                                                            Header="Store"
                                                            ShowDistinctFilters="True"
                                                            ShowFieldFilters="False"
                                                            TextAlignment="Center" />
     
                                <telerik:GridViewDataColumn Width="80"
                                                            DataFormatString="dd-MMM-yyyy"
                                                            DataMemberBinding="{Binding ASNDate}"
                                                            Header="Ship Date"
                                                            ShowDistinctFilters="False"
                                                            SortingState="Descending"
                                                            TextAlignment="Center" />
     
                                <telerik:GridViewDataColumn Width="Auto"
                                                            MinWidth="80"
                                                            DataMemberBinding="{Binding PONumber}"
                                                            Header="PO"
                                                            ShowDistinctFilters="False"
                                                            TextAlignment="Center" />
     
                                <telerik:GridViewDataColumn Width="80"
                                                            DataFormatString="dd-MMM-yyyy"
                                                            DataMemberBinding="{Binding PODate}"
                                                            Header="PO Date"
                                                            ShowDistinctFilters="False"
                                                            TextAlignment="Center" />
     
                                <telerik:GridViewDataColumn Width="Auto"
                                                            MinWidth="80"
                                                            DataMemberBinding="{Binding InvoiceNumber}"
                                                            Header="Invoice"
                                                            ShowDistinctFilters="False"
                                                            TextAlignment="Center" />
     
                                <telerik:GridViewDataColumn Width="Auto"
                                                            DataMemberBinding="{Binding ToteID}"
                                                            Header="Tote"
                                                            ShowDistinctFilters="True"
                                                            TextAlignment="Center">
                                    <telerik:GridViewDataColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Width="Auto"
                                                       Height="Auto"
                                                       HorizontalAlignment="Center"
                                                       VerticalAlignment="Center">
                                                <Hyperlink Click="OnToteClick" Tag="{Binding}">
                                                    <TextBlock Width="Auto"
                                                               Height="Auto"
                                                               HorizontalAlignment="Center"
                                                               VerticalAlignment="Center"
                                                               Text="{Binding ToteID}" />
                                                </Hyperlink>
                                            </TextBlock>
                                        </DataTemplate>
                                    </telerik:GridViewDataColumn.CellTemplate>
                                </telerik:GridViewDataColumn>
     
                                <telerik:GridViewDataColumn Width="80"
                                                            DataFormatString="dd-MMM-yyyy"
                                                            DataMemberBinding="{Binding Closed}"
                                                            Header="Completed"
                                                            ShowDistinctFilters="False" />
     
                                <telerik:GridViewDataColumn Width="Auto"
                                                            DataMemberBinding="{Binding ClosedByName}"
                                                            Header="Complete By"
                                                            ShowDistinctFilters="True"
                                                            ShowFieldFilters="False"
                                                            TextAlignment="Center" />
     
                            </telerik:RadGridView.Columns>
                        </telerik:RadGridView>
     
                        <telerik:RadDataPager x:Name="DataPager1"
                                              Grid.Row="1"
                                              Width="{Binding ActualWidth,
                                                              ElementName=RadGridView1}"
                                              Margin="5,0,5,5"
                                              DisplayMode="FirstLastPreviousNextNumeric"
                                              PageSize="{Binding PageSize,
                                                                 Mode=TwoWay}"
                                              Source="{Binding ShipmentData}"
                                              telerik:StyleManager.Theme="Summer" />

     

    public class ShipmentsViewModel : ViewModelBase
        {
            private readonly TIMS.Data.TIMSContext ctx =new Data.TIMSContext();
     
            public ShipmentsViewModel()
            {
                
            }
     
            #region Properties
     
            private int PageSizeValue = 20;
            public int PageSize
            {
                get { return PageSizeValue; }
                set
                {
                    SetPropertyValue((() => PageSize), ref PageSizeValue, value);
                }
            }
     
     
            private QueryableEntityCollectionView<TIMS.Data.Entities.ToteView> ShipmentDataValue;
            public QueryableEntityCollectionView<TIMS.Data.Entities.ToteView> ShipmentData
            {
                get {
                        return ShipmentDataValue;
                }
                private set
                {
                    SetPropertyValue((() => ShipmentData), ref ShipmentDataValue, value);
                }
            }
     
            #endregion
     
            #region Methods
     
            public override void OnNavigatedTo(Uri view, object data)
            {
                try
                {
                    IsBusy = true;
                    System.Threading.ThreadPool.QueueUserWorkItem(delegate
                    {
                        var shipments = new QueryableEntityCollectionView<Data.Entities.ToteView>(((IObjectContextAdapter)ctx).ObjectContext, "ToteViews");
                        if (App.Store != null)
                        {
                            shipments.FilterDescriptors.Add(new FilterDescriptor("StoreNumber", FilterOperator.IsEqualTo, App.Store.Value, false));
                        }
     
     
                        App.Current.Dispatcher.Invoke(new Action(delegate
                        {
                            ShipmentDataValue = shipments;
                            IsBusy = false;
                        }));
     
                    });
                }
                catch (Exception e)
                {
                    App.Current.Dispatcher.BeginInvoke(new Action(delegate
                    {
                        var dlg = new ChildWindows.ErrorDialog("0012:  An unknown error occured.");
                        App.LogError(e);
                        dlg.ShowDialog();
                        IsBusy = false;
                    }));
                }
            }
     
            #endregion
     
            #region Commands
     
     
            #endregion
        }

  2. Dimitrina
    Admin
    Dimitrina avatar
    3769 posts

    Posted 16 Jul 2015 Link to this post

    Hello,

    For the time being, RadEntityFrameworkDataSource does not support async loading. I have made a Feature Request on this public: Asynchronous support.
    You can vote for it and also follow the item to get notified once there is a change in its Status.

    For the time being, I can suggest you considering RadDataServiceDataSource, which handles all operations asynchronously. 

    Regards,
    Dimitrina
    Telerik
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
  3. UI for WPF is Visual Studio 2017 Ready
Back to Top