如何隐藏和显示带有动态创建的图表和动态复选框的LiveCharts系列?

时间:2019-06-16 11:33:24

标签: wpf series livecharts lineseries

在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;

我希望能够单击一个复选框,并在图表中显示/隐藏特定的系列。

1 个答案:

答案 0 :(得分:0)

可以通过几种方式完成。我在这里使用MVVM模式,但也可以为视图改编回代码

首先,我创建了一个类,该类结合了两个信息LineSeries和bool属性以提高可见性(也可以在此处使用转换器)。该类还具有简单的逻辑,即当更改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));
        }

    }

接下来是声明行系列的集合,对于wpf应用程序,请使用ObserableCollection

private ObservableCollection<LineSeriesVisible> _LineSeriesVisib;
public ObservableCollection<LineSeriesVisible> LineSeriesVisib
{
    get { return _LineSeriesVisib; }
    set
    {
        if (value != _LineSeriesVisib)
        {
            _LineSeriesVisib = value;
            NotifyPropertyChanged();
        }
    }
}

最后一部分将其绑定到ItemsControl控件。我们将集合投标给itemscontrol控件,并作为datatemplate使用复选框。

<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>

最后一个选择是在循环之后将行系列添加到ObseravableColleciton中。

LineSeriesVisib = new ObservableCollection<LineSeriesVisible>(ch.Series);

让我知道它是否有效。它对我有用:)