如何使用动态创建的图表和动态复选框隐藏和显示 LiveCharts 系列?
How can I hide and show LiveCharts series with dynamically created chart, and dynamic checkboxes?
在 LiveCharts 中,我正在创建一组带有 foreach 循环的 LineSeries。如何访问此列表中的特定行系列?我想在 WPF 中使用复选框显示和隐藏它们。
foreach (var item in ElementsList)
{
ch.Series.Add(new LineSeries
{
Values = item.Value.ElementValues,
Title = item.Value.ElementName,
Visibility = Visibility.Hidden
});
}
Chart = ch;
我希望能够单击复选框并在图表中显示特定系列 show/hide。
可以通过几种方式完成。我在这里使用 MVVM 模式,但也可以为视图调整 back-code
首先,我创建了一个 class,它结合了两个信息 LineSeries 和 bool 属性 以提高可见性(也可以在此处使用转换器)。 class 也有简单的逻辑,当 bool 的状态改变时,它也会改变系列的可见性 属性。
public class LineSeriesVisible : INotifyPropertyChanged
{
private Series _LineSerie;
public Series LineSerie
{
get { return _LineSerie; }
set
{
if (value != _LineSerie)
{
_LineSerie = value;
NotifyPropertyChanged();
}
}
}
private bool _Visibility;
public bool Visibility
{
get { return _Visibility; }
set
{
if (value != _Visibility)
{
_Visibility = value;
if (LineSerie != null)
{
if (value == true)
{
LineSerie.Visibility = System.Windows.Visibility.Visible;
}
else
{
LineSerie.Visibility = System.Windows.Visibility.Collapsed;
}
}
NotifyPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
接下来是为 line-series 声明集合,对于 wpf 应用程序使用 ObserableCollection
private ObservableCollection<LineSeriesVisible> _LineSeriesVisib;
public ObservableCollection<LineSeriesVisible> LineSeriesVisib
{
get { return _LineSeriesVisib; }
set
{
if (value != _LineSeriesVisib)
{
_LineSeriesVisib = value;
NotifyPropertyChanged();
}
}
}
最后一部分是将它绑定到 ItemsControl 控件。我们将集合绑定到 itemscontrol 控件并作为数据模板使用复选框。
<ItemsControl ItemsSource="{Binding LineSeriesVisib,
Mode=TwoWay,NotifyOnSourceUpdated=True,
UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding LineSerie.Title}" IsChecked="{Binding Visibility}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
最后一个选项是将您的 line-series 添加到循环后的 obseravablecolleciton。
LineSeriesVisib = new ObservableCollection<LineSeriesVisible>(ch.Series);
让我知道它是否有效。它对我有用:)
在 LiveCharts 中,我正在创建一组带有 foreach 循环的 LineSeries。如何访问此列表中的特定行系列?我想在 WPF 中使用复选框显示和隐藏它们。
foreach (var item in ElementsList)
{
ch.Series.Add(new LineSeries
{
Values = item.Value.ElementValues,
Title = item.Value.ElementName,
Visibility = Visibility.Hidden
});
}
Chart = ch;
我希望能够单击复选框并在图表中显示特定系列 show/hide。
可以通过几种方式完成。我在这里使用 MVVM 模式,但也可以为视图调整 back-code
首先,我创建了一个 class,它结合了两个信息 LineSeries 和 bool 属性 以提高可见性(也可以在此处使用转换器)。 class 也有简单的逻辑,当 bool 的状态改变时,它也会改变系列的可见性 属性。
public class LineSeriesVisible : INotifyPropertyChanged
{
private Series _LineSerie;
public Series LineSerie
{
get { return _LineSerie; }
set
{
if (value != _LineSerie)
{
_LineSerie = value;
NotifyPropertyChanged();
}
}
}
private bool _Visibility;
public bool Visibility
{
get { return _Visibility; }
set
{
if (value != _Visibility)
{
_Visibility = value;
if (LineSerie != null)
{
if (value == true)
{
LineSerie.Visibility = System.Windows.Visibility.Visible;
}
else
{
LineSerie.Visibility = System.Windows.Visibility.Collapsed;
}
}
NotifyPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
接下来是为 line-series 声明集合,对于 wpf 应用程序使用 ObserableCollection
private ObservableCollection<LineSeriesVisible> _LineSeriesVisib;
public ObservableCollection<LineSeriesVisible> LineSeriesVisib
{
get { return _LineSeriesVisib; }
set
{
if (value != _LineSeriesVisib)
{
_LineSeriesVisib = value;
NotifyPropertyChanged();
}
}
}
最后一部分是将它绑定到 ItemsControl 控件。我们将集合绑定到 itemscontrol 控件并作为数据模板使用复选框。
<ItemsControl ItemsSource="{Binding LineSeriesVisib,
Mode=TwoWay,NotifyOnSourceUpdated=True,
UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding LineSerie.Title}" IsChecked="{Binding Visibility}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
最后一个选项是将您的 line-series 添加到循环后的 obseravablecolleciton。
LineSeriesVisib = new ObservableCollection<LineSeriesVisible>(ch.Series);
让我知道它是否有效。它对我有用:)