无法将 SeriesCollection 值绑定到 DataGrid
Unable to bind SeriesCollection values to DataGrid
我目前正在使用 Livecharts,我正在尝试将 SeriesCollection 绑定到 DataGrid。可以绑定它,但是这个系列有一些值,我希望 DataGrid 显示这些值。但是只显示绑定了两个SeriesCollection项LiveCharts.SeriesAlgorithm.LineAlgorithm,不知道是否需要转换器来解决这个问题
xaml.cs
public MyConstructor()
{
SeriesCollection = new SeriesCollection();
SeriesCollection.Add(reducedValuesLineSeries); // adds some points
SeriesCollection.Add(fullValuesLineSeries); // adds a line composed by many ponits
}
private SeriesCollection seriesCollection;
public SeriesCollection SeriesCollection
{
get => seriesCollection;
set
{
seriesCollection = value;
OnPropertyChanged();
}
}
xaml
<DataGrid ItemsSource="{Binding SeriesCollection}"/>
您必须实施 IValueConverter
才能从系列中提取这些点。显然,这些点深埋在“集合”中。名称 collection 在这里非常具有误导性,因为 SeriesCollection
与其说是一个实际的集合,不如说是一个数据模型。整个库实现起来比较混乱。
您实际拥有什么数据类型作为数据点取决于您的实现。遗憾的是,您没有显示这些详细信息。
此示例假定数据项的类型为 Point
:
ViewModel.cs
class ViewModel
{
public ViewModel()
{
var chartValues = new ChartValues<Point>();
// Create a sine
for (int x = 0; x < 361; x++)
{
var point = new Point() {X = x, Y = Math.Sin(x * Math.PI / 180)};
chartValues.Add(point);
}
this.SeriesCollection = new SeriesCollection
{
new LineSeries
{
Configuration = new CartesianMapper<Point>()
.X(point => point.X)
.Y(point => point.Y),
Title = "Series X",
Values = chartValues,
Fill = Brushes.DarkRed
}
};
}
}
SeriesCollectionToPointsConverter.cs
class SeriesCollectionToPointsConverter : IValueConverter
{
#region Implementation of IValueConverter
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
value is SeriesCollection seriesCollection
? seriesCollection.SelectMany(series => series.Values as ChartValues<Point>)
: Binding.DoNothing;
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
throw new NotSupportedException();
#endregion
}
MainWindow.xaml
<Window>
<Window.DataContext>
<ViewModel />
</Window.DataContext>
<Window.Resources>
<SeriesCollectionToPointsConverter x:Key="SeriesCollectionToPointsConverter" />
</Window.Resources>
<DataGrid ItemsSource="{Binding SeriesCollection, Converter={StaticResource SeriesCollectionToPointsConverter}}" />
</Window>
我目前正在使用 Livecharts,我正在尝试将 SeriesCollection 绑定到 DataGrid。可以绑定它,但是这个系列有一些值,我希望 DataGrid 显示这些值。但是只显示绑定了两个SeriesCollection项LiveCharts.SeriesAlgorithm.LineAlgorithm,不知道是否需要转换器来解决这个问题
xaml.cs
public MyConstructor()
{
SeriesCollection = new SeriesCollection();
SeriesCollection.Add(reducedValuesLineSeries); // adds some points
SeriesCollection.Add(fullValuesLineSeries); // adds a line composed by many ponits
}
private SeriesCollection seriesCollection;
public SeriesCollection SeriesCollection
{
get => seriesCollection;
set
{
seriesCollection = value;
OnPropertyChanged();
}
}
xaml
<DataGrid ItemsSource="{Binding SeriesCollection}"/>
您必须实施 IValueConverter
才能从系列中提取这些点。显然,这些点深埋在“集合”中。名称 collection 在这里非常具有误导性,因为 SeriesCollection
与其说是一个实际的集合,不如说是一个数据模型。整个库实现起来比较混乱。
您实际拥有什么数据类型作为数据点取决于您的实现。遗憾的是,您没有显示这些详细信息。
此示例假定数据项的类型为 Point
:
ViewModel.cs
class ViewModel
{
public ViewModel()
{
var chartValues = new ChartValues<Point>();
// Create a sine
for (int x = 0; x < 361; x++)
{
var point = new Point() {X = x, Y = Math.Sin(x * Math.PI / 180)};
chartValues.Add(point);
}
this.SeriesCollection = new SeriesCollection
{
new LineSeries
{
Configuration = new CartesianMapper<Point>()
.X(point => point.X)
.Y(point => point.Y),
Title = "Series X",
Values = chartValues,
Fill = Brushes.DarkRed
}
};
}
}
SeriesCollectionToPointsConverter.cs
class SeriesCollectionToPointsConverter : IValueConverter
{
#region Implementation of IValueConverter
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
value is SeriesCollection seriesCollection
? seriesCollection.SelectMany(series => series.Values as ChartValues<Point>)
: Binding.DoNothing;
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
throw new NotSupportedException();
#endregion
}
MainWindow.xaml
<Window>
<Window.DataContext>
<ViewModel />
</Window.DataContext>
<Window.Resources>
<SeriesCollectionToPointsConverter x:Key="SeriesCollectionToPointsConverter" />
</Window.Resources>
<DataGrid ItemsSource="{Binding SeriesCollection, Converter={StaticResource SeriesCollectionToPointsConverter}}" />
</Window>