Saya secara tidak sinkron mendapatkan data dan mencoba mengisi plot melalui LineSeries, kecuali plot tersebut tidak disegarkan ketika koleksi terikat (ObservableCollection) diperbarui. Catatan: Saya memiliki perilaku XAML untuk memanggil InvalidatePlot(true) ketika koleksi terikat berubah.
Adakah yang bisa menjelaskan mengapa plotnya tidak diperbarui seperti yang diharapkan?
WPF .Net 4.0 OxyPlot 2014.1.293.1
Saya memiliki templat data XAML berikut, seperti yang Anda lihat LineSeries ItemsSource terikat ke properti (PlotData) di ViewModel:
<DataTemplate DataType="{x:Type md:DataViewModel}">
<Grid>
<oxy:Plot x:Name="MarketDatePlot"
Margin="10">
<oxy:Plot.Axes>
<oxy:DateTimeAxis Position="Bottom"
StringFormat="dd/MM/yy"
MajorGridlineStyle="Solid"
MinorGridlineStyle="Dot"
IntervalType="Days"
IntervalLength="80" />
<oxy:LinearAxis Position="Left"
MajorGridlineStyle="Solid"
MinorGridlineStyle="Dot"
IntervalLength="100" />
</oxy:Plot.Axes>
<oxy:LineSeries ItemsSource="{Binding Path=PlotData, Mode=OneWay}" />
<i:Interaction.Behaviors>
<behaviors:OxyPlotBehavior ItemsSource="{Binding Path=PlotData, Mode=OneWay}" />
</i:Interaction.Behaviors>
</oxy:Plot>
</Grid>
</DataTemplate>
Seperti yang saya katakan, ViewModel meminta dan mengisi koleksi terikat secara asinkron (populasi sebenarnya dari koleksi terikat terjadi di thread UI):
public sealed class DataViewModel : BaseViewModel, IDataViewModel
{
private readonly CompositeDisposable _disposable;
private readonly CancellationTokenSource _cancellationTokenSource;
private readonly RangeObservableCollection<DataPoint> _plotData;
public DataViewModel(DateTime fromDate, DateTime toDate, IMarketDataService marketDataService, ISchedulerService schedulerService)
{
_plotData = new RangeObservableCollection<DataPoint>();
_disposable = new CompositeDisposable();
if (fromDate == toDate)
{
// nothing to do...
return;
}
_cancellationTokenSource = new CancellationTokenSource();
_disposable.Add(Disposable.Create(() =>
{
if (!_cancellationTokenSource.IsCancellationRequested)
{
_cancellationTokenSource.Cancel();
}
}));
marketDataService.GetDataAsync(fromDate, toDate)
.ContinueWith(t =>
{
if (t.IsFaulted)
{
throw new Exception("Failed to get market data!", TaskHelper.GetFirstException(t));
}
return t.Result.Select(x => new DataPoint(DateTimeAxis.ToDouble(x.Time), x.Value));
}, schedulerService.Task.Default)
.SafeContinueWith(t => _plotData.AddRange(t.Result), schedulerService.Task.CurrentSynchronizationContext);
}
public void Dispose()
{
_disposable.Dispose();
}
public IEnumerable<DataPoint> PlotData
{
get { return _plotData; }
}
}
Dan perilaku XAML terlihat seperti ini:
(Sepertinya saya tidak bisa menempelkan kode lagi, SO terus membuat kesalahan saat menyimpan)
RangeObservableCollection
? Selain itu, apakah ada bedanya jika properti Anda sebenarnya adalahObservableCollection
dan bukanIEnumerable<>
? Saya tahu anggota data yang mendasarinya adalah (dengan asumsiRangeObservableCollection
berasal dariObservableCollection
) tapi saya tidak yakin apakah itu cukup baik untuk sistem pengikatan. - person Tim   schedule 08.05.2014