Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ObservableCollection未正确加载数据_C#_Xaml_Xamarin_Xamarin.forms_Syncfusion - Fatal编程技术网

C# ObservableCollection未正确加载数据

C# ObservableCollection未正确加载数据,c#,xaml,xamarin,xamarin.forms,syncfusion,C#,Xaml,Xamarin,Xamarin.forms,Syncfusion,我有一个syncfusionlistview,它通过RESTAPI调用更新数据库中的数据,这只是我尝试做的一点背景知识。我得到每周的数据。视图上还有一个按钮,该按钮应使用每月数据更新列表 对于每周,我在数据库中有一条记录,列表中填充了数据。单击“查看全部”按钮后,db给出数据,列表接收13条记录,但视图仅更新其中一条记录。看起来列表中只显示了一个。代码如下: private ObservableCollection<TransactionInformationDto> listIt

我有一个syncfusion
listview
,它通过RESTAPI调用更新数据库中的数据,这只是我尝试做的一点背景知识。我得到每周的数据。视图上还有一个按钮,该按钮应使用每月数据更新列表

对于每周,我在数据库中有一条记录,列表中填充了数据。单击“查看全部”按钮后,db给出数据,列表接收13条记录,但视图仅更新其中一条记录。看起来列表中只显示了一个。代码如下:

 private ObservableCollection<TransactionInformationDto> listItems;


    public ObservableCollection<TransactionChartData> ChartData { get; set; }
    public ObservableCollection<TransactionInformationDto> TransactionList
    {
        get { return listItems; }
        set { listItems = value; OnPropertyChanged(nameof(TransactionList)); }

    }

    public ICommand GetTransactions => new Command(async () =>
    {
         IsBusy = true;
         TransactionList.Clear();
         var data = await GetAllTransactions();
          foreach(var item in data)
          {
              TransactionList.Add(item);
          }
         IsBusy = false;
    });

    public Command<object> ItemTappedCommand
    {
        get
        {
            return this.itemTappedCommand ?? (this.itemTappedCommand = new Command<object>(ShowTransactionInformation));
        }
    }

    private void ShowTransactionInformation(object item)
    {
        var list = item as Syncfusion.ListView.XForms.ItemTappedEventArgs;
        var transaction = (TransactionInformationDto)list.ItemData;
        Navigation.PushAsync(new TransactionInfoPage(transaction));
    }
    #endregion

    #region Constructor
    public DashboardPageViewModel(INavigation navigation)
    {
        LoadTransactionDetails();
        
        Navigation = navigation;
    }

    #endregion

    #region Properties

    public double TotalBalance
    {
        get
        {
            return totalBalance;
        }
        set
        {
            this.totalBalance = value;
            this.OnPropertyChanged();
        }
    }

    public INavigation Navigation { get; }
    #endregion

    #region Methods
    private async Task<ObservableCollection<TransactionInformationDto>> GetAllTransactions()
    {      
           var retrievalInformation = await App.Database.GetUserRetrievalInformation();
            return new ObservableCollection<TransactionInformationDto>(await DependencyService.Get<IGetInformation>().GetAllUserTransactions(retrievalInformation));
    }

    private void LoadTransactionDetails()
    {
        var userTransactions = new List<TransactionInformationDto>();
        Task.Run(async () => {
            var retrievalInformation = await App.Database.GetUserRetrievalInformation();
            var userBalance = await DependencyService.Get<IGetInformation>().GetUserBalanceInformation(retrievalInformation);
            TotalBalance = userBalance.CurrentBalance;
            userTransactions = await DependencyService.Get<IGetInformation>().GetTransactionData(retrievalInformation);
        });

        Thread.Sleep(1000);
        WeekData(userTransactions);
    }

    private void WeekData(List<TransactionInformationDto> transactionInformation)
    {
        TransactionList = new ObservableCollection<TransactionInformationDto>();
        var data = new ObservableCollection<TransactionInformationDto>(transactionInformation.OrderByDescending(x =>x.TimeStamp));
        foreach(var item in data)
        {
            TransactionList.Add(item);
        }
        days = new string[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
        ChartData = new ObservableCollection<TransactionChartData>();
        UpdateChartData(days);
    }
私有可观察收集列表项;
公共ObservableCollection ChartData{get;set;}
公共可观察收集事务列表
{
获取{返回listItems;}
set{listItems=value;OnPropertyChanged(nameof(TransactionList));}
}
公共ICommand GetTransactions=>new命令(异步()=>
{
IsBusy=true;
TransactionList.Clear();
var data=等待GetAllTransactions();
foreach(数据中的var项)
{
交易清单。添加(项目);
}
IsBusy=false;
});
公共命令项tappedcommand
{
得到
{
返回此.itemTappedCommand??(此.itemTappedCommand=新命令(ShowTransactionInformation));
}
}
私有void ShowTransactionInformation(对象项)
{
var list=作为Syncfusion.ListView.XForms.ItemTappedEventArgs的项目;
var transaction=(transactionformationdto)list.ItemData;
Navigation.PushAsync(新事务处理网页(事务));
}
#端区
#区域构造函数
公共仪表板PageViewModel(激活导航)
{
LoadTransactionDetails();
导航=导航;
}
#端区
#区域属性
公共双总量平衡
{
得到
{
返回总余额;
}
设置
{
这个。总平衡=价值;
this.OnPropertyChanged();
}
}
公共激活导航{get;}
#端区
#区域方法
专用异步任务GetAllTransactions()
{      
var retrievalinfo=wait App.Database.GetUserRetrievalInformation();
返回新的ObservableCollection(等待DependencyService.Get().GetAllUserTransactions(retrievalInformation));
}
私有void LoadTransactionDetails()
{
var userTransactions=新列表();
Task.Run(异步()=>{
var retrievalinfo=wait App.Database.GetUserRetrievalInformation();
var userBalance=wait DependencyService.Get().GetUserBalanceInformation(retrievalInformation);
TotalBalance=userBalance.CurrentBalance;
userTransactions=Wait DependencyService.Get().GetTransactionData(retrievalInformation);
});
睡眠(1000);
工作日数据(用户事务);
}
私有无效工作日数据(列表交易信息)
{
TransactionList=新的ObservableCollection();
var数据=新的ObservableCollection(transactionInformation.OrderByDescending(x=>x.TimeStamp));
foreach(数据中的var项)
{
交易清单。添加(项目);
}
天=新字符串[]{“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”、“星期日”};
ChartData=新的ObservableCollection();
UpdateChartData(天);
}
XAML

<Grid Grid.Row="1">

                    <Label Margin="16,26,16,16"
                           Text="TRANSACTIONS"
                           TextColor="{StaticResource Gray-800}"
                           FontSize="12"
                           LineHeight="{OnPlatform Android=1.5, Default=-1}" 
                           HorizontalOptions="Start" />

                    <buttons:SfButton Margin="11,26,11,16"
                                      BorderWidth="0"
                                      TextColor="{StaticResource Gray-600}"
                                      BackgroundColor="{StaticResource Transparent}"
                                      WidthRequest="72"
                                      HeightRequest="18"
                                      Command="{Binding GetTransactions}"
                                      CornerRadius="4"
                                      HorizontalOptions="End">
                        <Label Text="VIEW ALL"
                               TextColor="{DynamicResource Link}"
                               FontSize="12"
                               HorizontalTextAlignment="Center"
                               VerticalTextAlignment="Center"
                               LineHeight="{OnPlatform Android=1.5, Default=-1}"
                                />
                    </buttons:SfButton>

                </Grid>

                <listView:SfListView Grid.Row="2" 
                                     x:Name="_transactionList"
                                     IsScrollBarVisible="False"
                                     ItemSpacing="0"
                                     ItemsSource="{Binding TransactionList}"
                                     SelectionBackgroundColor="{StaticResource TappedBackgroundColor}"
                                     TapCommand="{Binding ItemTappedCommand}"
                                     AutoFitMode="Height"
                                     BackgroundColor="White">
                    <listView:SfListView.ItemTemplate>
                        <DataTemplate>
                            <Grid RowSpacing="0" ColumnSpacing="0">

                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto" />
                                    <RowDefinition Height="Auto" />
                                    <RowDefinition Height="Auto" />
                                </Grid.RowDefinitions>

                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="*" />
                                </Grid.ColumnDefinitions>   
                                
                                 <!--Profile pic-->
                                <border:SfBorder Grid.RowSpan="3"
                                                 Margin="16"
                                                 WidthRequest="40"
                                                 HeightRequest="40"
                                                 CornerRadius="20"
                                                 BorderWidth="0"
                                                 VerticalOptions="Center">
                                    <Image Aspect="Fill"
                                           Source="receipt">
                                    </Image>
                                </border:SfBorder>

                                <!-- Name -->
                                <Label Grid.Column="1"
                                       Margin="0,15,0,4"
                                       HorizontalOptions="Start"
                                       Text="{Binding ReceiverName}"
                                       LineHeight="{OnPlatform Android=1.5, Default=-1}" />

                                <!-- Transaction Title -->
                                <Label Grid.Row="1"
                                       Grid.Column="1"
                                       Margin="0,0,0,16"
                                       HorizontalOptions="Start"
                                       Text="{Binding TransactionMessage}"
                                       TextColor="{StaticResource Gray-700}"
                                       FontSize="12"
                                       LineHeight="{OnPlatform Android=1.5, Default=-1}" />

                                <!-- Amount -->
                                <Label Grid.Column="1"
                                       Margin="0,16,16,4"
                                       HorizontalOptions="End"
                                       TextColor="{Binding IsReceived, Converter={x:StaticResource BooleanToColorConverter}, ConverterParameter=5}"
                                       LineHeight="{OnPlatform Android=1.5, Default=-1}">
                                    <Label.FormattedText>
                                        <FormattedString>
                                            <Span Text="{Binding IsReceived, Converter={StaticResource BooleanToStringConverter}, ConverterParameter=2}" />
                                            <Span Text=" $" />
                                            <Span Text="{Binding TransactionAmount}" />
                                        </FormattedString>
                                    </Label.FormattedText>
                                </Label>

                                <!-- Date -->
                                <Label Grid.Row="1"
                                       Grid.Column="1"
                                       Margin="0,0,16,16"
                                       HorizontalOptions="End"
                                       Text="{Binding TimeStamp, StringFormat='{}{0:dd MMM yyyy}'}"
                                       TextColor="{StaticResource Gray-700}"
                                       FontSize="12"
                                       LineHeight="{OnPlatform Android=1.5, Default=-1}" />

                                <!-- Seperator -->
                                <BoxView Grid.Row="2" Grid.ColumnSpan="2" Style="{StaticResource SeparatorStyle}" />

                            </Grid>

                        </DataTemplate>
                    </listView:SfListView.ItemTemplate>
                </listView:SfListView>
                <controls:Popup Grid.Row="2" Grid.RowSpan="1" IsBusy="{Binding IsBusy}" IsEnabled="{Binding IsBusy}" LoadingMessage="Loading the list.." />
            </Grid>`

`
任何帮助都将不胜感激

  • 永远不要使用Thread.Sleep()。如果UI在UI线程上运行,它会阻止UI(UI挂起/不响应)
  • 1.1。试图通过添加Thread.Sleep()和Task.Delay()来修复某些问题,这是向地狱迈进的一步。不要进入这条路

  • 您不需要在任何地方都使用ObservableCollection。如果不需要可观测性,请使用IList或IEnumerable或数组
  • Task.Run()装入一个新线程。你通常不需要这个数据绑定中存在问题,因为需要确保绑定在UI线程上执行,以便能够更新UI组件
  • 不要在构造函数中加载数据。触发加载和生命周期事件,如PageExaming()()
  • 更新代码

    private ObservableCollection<TransactionInformationDto> listItems;
    
    
    public ObservableCollection<TransactionChartData> ChartData { get; set; }
    public ObservableCollection<TransactionInformationDto> TransactionList
    {
        get { return listItems; }
        set { listItems = value; OnPropertyChanged(nameof(TransactionList)); }
    
    }
    
    public ICommand GetTransactions => new Command(async () =>
    {
         IsBusy = true;
         TransactionList.Clear();
         var data = await GetAllTransactions();
         TransactionList = new ObservableCollection<TransactionInformationDto>(data);
         IsBusy = false;
    });
    
    public Command<object> ItemTappedCommand
    {
        get
        {
            return this.itemTappedCommand ?? (this.itemTappedCommand = new Command<object>(ShowTransactionInformation));
        }
    }
    
    private void ShowTransactionInformation(object item)
    {
        var list = item as Syncfusion.ListView.XForms.ItemTappedEventArgs;
        var transaction = (TransactionInformationDto)list.ItemData;
        Navigation.PushAsync(new TransactionInfoPage(transaction));
    }
    #endregion
    
    #region Constructor
    public DashboardPageViewModel(INavigation navigation)
    {
        // LoadTransactionDetails(); // <<< see 4.
        
        Navigation = navigation;
    }
    
    #endregion
    
    #region Properties
    
    public double TotalBalance
    {
        get
        {
            return totalBalance;
        }
        set
        {
            this.totalBalance = value;
            this.OnPropertyChanged();
        }
    }
    
    public INavigation Navigation { get; }
    #endregion
    
    #region Methods
    private async Task<IEnumerable<TransactionInformationDto>> GetAllTransactions() // see 2.
    {      
           var retrievalInformation = await App.Database.GetUserRetrievalInformation();
           return await DependencyService.Get<IGetInformation>().GetAllUserTransactions(retrievalInformation);
    }
    
    private async Task LoadTransactionDetails()
    {
        var userTransactions = new List<TransactionInformationDto>();  
        // see 3.
        var retrievalInformation = await App.Database.GetUserRetrievalInformation();
        var userBalance = await DependencyService.Get<IGetInformation>().GetUserBalanceInformation(retrievalInformation);
        TotalBalance = userBalance.CurrentBalance;
        userTransactions = await DependencyService.Get<IGetInformation>().GetTransactionData(retrievalInformation);
        // see. 1. & 1.1.
        WeekData(userTransactions);
    }
    
    private void WeekData(List<TransactionInformationDto> transactionInformation)
    {
        TransactionList = new ObservableCollection<TransactionInformationDto>(transactionInformation.OrderByDescending(x =>x.TimeStamp));
        days = new string[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
        ChartData = new ObservableCollection<TransactionChartData>();
        UpdateChartData(days);
    }
    
    私有可观察收集列表项;
    公共ObservableCollection ChartData{get;set;}
    公共可观察收集事务列表
    {
    获取{return l