如何解决Xamarin.Forms SFChart DataBinding:更改绑定数据对象会导致错误和崩溃
最近,我们在我的 Xamarin.Forms 应用程序中发现了一个错误,该错误似乎与 Syncfusion 元素“SfChart”有关。
我们有一个通过数据绑定获取数据的 4 轴图表。当图表用来绘制线条的一个承载数据的对象被删除、添加或更改时,就会发生错误。
此数据存储在 ObservableCollection 中,并在更改时发出 PropertyChanged 信号。
每当将不同的数据对象分配给数据列表的索引,绑定到单个 FastLineseries 的 ItemSources 时,我有时会收到以下错误:
[mono-rt] [ERROR] 致命的未处理异常:System.ArgumentOutOfRangeException:索引必须在列表的范围内。
[mono-rt] 参数名:index
[mono-rt] 在 System.Collections.Generic.List`1[T].Insert(system.int32 索引,T 项)[0x00009] 在 /Users/builder/jenkins/workspace/archive-mono/2020 -02/android/release/external/corefx/src/Common/src/CoreLib/System/Collections/Generic/List.cs:688
[mono-rt] 在 Com.Syncfusion.Charts.ChartSeries.SetIndividualPoint(system.int32 索引、System.Object 值、System.Boolean 替换)[0x007d4] 在 :0
[mono-rt] 在 Com.Syncfusion.Charts.ChartSeries.OnDataSource_CollectionChanged(System.Object 发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)[0x00041] 在 :59d
[mono-rt] at (wrapper delegate-invoke) .invoke_void_object_NotifyCollectionChangedEventArgs(object,System.Collections.Specialized.NotifyCollectionChangedEventArgs)
[mono-rt] 在 System.Collections.ObjectModel.ObservableCollection`1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e) [0x00018] 在 /Users/builder/jenkins/workspace/archive-mono/ 2020-02/android/release/external/corefx/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs:263
[mono-rt] 在 MvvmCross.viewmodels.MvxObservableCollection`1[T].n__0 (System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 在 1p3p3p3>
[mono-rt] 在 MvvmCross.viewmodels.MvxObservableCollection`1+c_displayClass7_0[T].b0 () [0x00000] 在 //MvvmCross/viewmodels/MvxObservableCollection.cs:72
[mono-rt] at MvvmCross.Base.MvxMainThreadAsyncdispatcher+c_displayClass0_0.b0 () [0x00000] in //MvvmCross/Base/MvxMainThreadAsyncdispatcher.cs:16
[mono-rt] at MvvmCross.Base.MvxMainThreadAsyncdispatcher+c_displayClass1_0.b0() [0x00011] in //MvvmCross/Base/MvxMainThreadAsyncdispatcher.cs:27
[mono-rt] at (wrapper dynamic-method) Android.Runtime.DynamicmethodNameCounter.26(intptr,intptr)
[mono-rt] at (wrapper native-to-managed) Android.Runtime.DynamicmethodNameCounter.26(intptr,intptr)
似乎有时在更改或删除 Lineseries 的数据后,旧数据仍保留在 UI 元素中,并且绘制了两个具有相同颜色的相同 Lineseries,即使此数据不在数据中的任何位置绑定列表。
奇怪的是,图表绘制了两条颜色相同但值相差很大的线,尽管一个 Lineseries 应该能够从中获取数据的可能绑定只有一种。
最好的问候, O.B.
The picture shows the chart with the wrong double yellow lines
XAML 如下所示:
<Grid
Grid.Row="0"
Grid.Column="0"
BackgroundColor="#0072BC"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand">
<Grid.ColumnDeFinitions>
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
</Grid.ColumnDeFinitions>
<Grid.GestureRecognizers>
<TapGestureRecognizer Command="{Binding TapChartSelectionPopup}" CommandParameter="0" />
</Grid.GestureRecognizers>
<Label
Grid.Column="0"
BackgroundColor="#ED1B2F"
HorizontalOptions="FillAndExpand" />
<Label
Grid.Column="1"
Grid.ColumnSpan="4"
HorizontalOptions="Start"
Text="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[0].Name}" />
<Label
x:Name="UnitLabel1"
Grid.Column="5"
Grid.ColumnSpan="2"
HorizontalOptions="FillAndExpand"
Text="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[0].Unit}"
TextColor="White"
VerticalOptions="FillAndExpand" />
<Image
Grid.Column="6"
Grid.ColumnSpan="2"
Margin="0,-5,0"
HorizontalOptions="Center"
Scale="0.7"
Source="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[0].ImagePath}" />
</Grid>
<Grid
Grid.Row="0"
Grid.Column="1"
BackgroundColor="#0072BC"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand">
<Grid.ColumnDeFinitions>
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
</Grid.ColumnDeFinitions>
<Grid.GestureRecognizers>
<TapGestureRecognizer Command="{Binding TapChartSelectionPopup}" CommandParameter="1" />
</Grid.GestureRecognizers>
<Label
Grid.Column="0"
BackgroundColor="#8DC63F"
HorizontalOptions="FillAndExpand" />
<Label
Grid.Column="1"
Grid.ColumnSpan="4"
HorizontalOptions="Start"
Text="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[1].Name}" />
<Label
x:Name="UnitLabel2"
Grid.Column="5"
Grid.ColumnSpan="2"
HorizontalOptions="FillAndExpand"
Text="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[1].Unit}"
TextColor="White"
VerticalOptions="FillAndExpand" />
<Image
Grid.Column="6"
Grid.ColumnSpan="2"
Margin="0,0"
HorizontalOptions="Center"
Scale="0.7"
Source="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[1].ImagePath}" />
</Grid>
<Grid
Grid.Row="1"
Grid.Column="0"
BackgroundColor="#0072BC"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand">
<Grid.ColumnDeFinitions>
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
</Grid.ColumnDeFinitions>
<Grid.GestureRecognizers>
<TapGestureRecognizer Command="{Binding TapChartSelectionPopup}" CommandParameter="2" />
</Grid.GestureRecognizers>
<Label
Grid.Column="0"
BackgroundColor="#07426E"
HorizontalOptions="FillAndExpand" />
<Label
Grid.Column="1"
Grid.ColumnSpan="4"
HorizontalOptions="Start"
Text="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[2].Name}" />
<Label
x:Name="UnitLabel3"
Grid.Column="5"
Grid.ColumnSpan="2"
HorizontalOptions="FillAndExpand"
Text="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[2].Unit}"
TextColor="White"
VerticalOptions="FillAndExpand" />
<Image
Grid.Column="6"
Grid.ColumnSpan="2"
Margin="0,0"
HorizontalOptions="Center"
Scale="0.7"
Source="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[2].ImagePath}" />
</Grid>
<Grid
Grid.Row="1"
Grid.Column="1"
BackgroundColor="#0072BC"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand">
<Grid.ColumnDeFinitions>
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="*" />
</Grid.ColumnDeFinitions>
<Grid.GestureRecognizers>
<TapGestureRecognizer Command="{Binding TapChartSelectionPopup}" CommandParameter="3" />
</Grid.GestureRecognizers>
<Label
Grid.Column="0"
BackgroundColor="#FFCC00"
HorizontalOptions="FillAndExpand" />
<Label
Grid.Column="1"
Grid.ColumnSpan="4"
HorizontalOptions="Start"
Text="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[3].Name}" />
<Label
x:Name="UnitLabel4"
Grid.Column="5"
Grid.ColumnSpan="2"
HorizontalOptions="FillAndExpand"
Text="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[3].Unit}"
TextColor="White"
VerticalOptions="FillAndExpand" />
<Image
Grid.Column="6"
Grid.ColumnSpan="2"
Margin="0,0"
HorizontalOptions="Center"
Scale="0.7"
Source="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[3].ImagePath}" />
</Grid>
</Grid>
</StackLayout>
<StackLayout
HorizontalOptions="FillAndExpand"
Orientation="Horizontal"
RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativetoParent,Property=Height,Factor=0.75}"
RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativetoParent,Property=Width,Factor=0.9}"
RelativeLayout.XConstraint="{ConstraintExpression Type=RelativetoParent,Factor=0.05}"
RelativeLayout.YConstraint="{ConstraintExpression Type=RelativetoParent,Factor=0.25}"
VerticalOptions="FillAndExpand">
<sfChart:SfChart
x:Name="chart"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand">
<sfChart:SfChart.PrimaryAxis>
<sfChart:DateTimeAxis />
</sfChart:SfChart.PrimaryAxis>
<sfChart:SfChart.ChartBehaviors>
<sfChart:ChartZoomPanBehavior EnableDirectionalZooming="True" EnableDoubleTap="True" />
</sfChart:SfChart.ChartBehaviors>
<sfChart:SfChart.Series>
<sfChart:FastLineseries
x:Name="flSeries1"
ItemsSource="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[0].ChartDataLog}"
XBindingPath="TestDT"
YBindingPath="Value"
Color="#ED1B2F" />
<sfChart:FastLineseries
x:Name="flSeries2"
ItemsSource="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[1].ChartDataLog}"
XBindingPath="TestDT"
YBindingPath="Value"
Color="#8DC63F" />
<sfChart:FastLineseries
x:Name="flSeries3"
ItemsSource="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[2].ChartDataLog}"
XBindingPath="TestDT"
YBindingPath="Value"
Color="#07426E" />
<sfChart:FastLineseries
x:Name="flSeries4"
ItemsSource="{Binding PanelAppModel.PanelApp.ChartModel.ChartDataList[3].ChartDataLog}"
XBindingPath="TestDT"
YBindingPath="Value"
Color="#FFCC00" />
</sfChart:SfChart.Series>
</sfChart:SfChart>
</StackLayout>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。