WPF如何在LiveCharts中将动态创建的复选框绑定到动态创建的系列?

时间:2019-06-14 01:48:08

标签: wpf checkbox dynamic livecharts

我有一个liveChart,正在为列表中的每个项目创建复选框。此列表还在liveCharts中包含每个系列的数据。如何将动态创建的复选框与数据中的每个LiveCharts.LineSeries绑定?

我已经创建了复选框:

<!-- Creating checkboxes by binding to list -->
<ListView ItemsSource="{Binding ElementItemList}" 
ScrollViewer.HorizontalScrollBarVisibility="Disabled" Width="600">
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel />
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Path=ElementName}" />
                        <CheckBox IsChecked="{Binding Path=ElementIsSelected}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>

        </ListView>

<!-- Display the chart -->
<Grid Grid.Row="1" x:Name="TestGrid"></Grid>

1 个答案:

答案 0 :(得分:0)

因此,我假设您希望有一个CheckBox代表您的LineSeries中的每个SeriesCollection

因此,我将拥有两个public属性,一个属性用于SeriesCollection,另一个属性用于CheckBox控件列表。

public SeriesCollection SeriesCollection { get; set; }
public List<CheckBox> CheckBoxCollection { get; set; }

然后,下面的函数可以模拟动态创建LineSeriesCheckBox控件,因为您没有提供该代码。在CheckBox控件和您的行系列之间建立某种联系非常重要,在这种情况下,我决定将LineSeries.TitleCheckBox.Name设置为相同。

还请注意,为了使CheckBox在选中/取消选中时执行某项操作,您需要为每个事件注册两个事件。

public void DynamicallyCreateStuff()
{
    SeriesCollection = new SeriesCollection();
    CheckBoxCollection = new List<CheckBox>();

    var count = 3;
    var val1 = new List<double>() { 1, 2, 3 };
    var val2 = new List<double>() { 9, 5, 3 };
    var val3 = new List<double>() { 1, 4, 9 };

    for (int i = 1; i <= count; i++)
    {
        var name = string.Format("LineSeries{0}", i);

        var checkBox = new CheckBox
        {
            Name = name,
            Content = name,
            Margin = new Thickness() { Left = 8, Top = 8, Right = 8, Bottom = 8 },
            IsChecked = true
        };
        checkBox.Checked += DynamicCheckBoxChecked;
        checkBox.Unchecked += DynamicCheckBoxUnchecked;
        CheckBoxCollection.Add(checkBox);

        var lineSeries = new LineSeries
        {
            Title = name
        };
        if (i == 1)
        {
            lineSeries.Values = new ChartValues<double>(val1);
        }
        else if (i == 2)
        {
            lineSeries.Values = new ChartValues<double>(val2);
        }
        else if (i == 3)
        {
            lineSeries.Values = new ChartValues<double>(val3);
        }

        SeriesCollection.Add(lineSeries);
    }
}

就我而言,我决定单击CheckBox时相应的系列将变为可见/隐藏,因此我的check / uncheck方法如下所示:

private void DynamicCheckBoxChecked(object sender, EventArgs e)
{
    ShowHideSeries(sender, Visibility.Visible);
}

private void DynamicCheckBoxUnchecked(object sender, EventArgs e)
{
    ShowHideSeries(sender, Visibility.Collapsed);
}

private void ShowHideSeries(object sender, Visibility visibility)
{
    var checkBox = (CheckBox)sender;
    var found = SeriesCollection.FirstOrDefault(x => x.Title == checkBox.Name);
    if (found != null)
    {
        var series = (LineSeries)found;
        series.Visibility = visibility;
    }
}

为了节省时间和简单起见,我没有使用ViewModel,所以我的MainWindow构造函数看起来像这样:

public MainWindow()
{
    InitializeComponent();
    DynamicallyCreateStuff();
    DataContext = this;
}

XAML在这里很裸露:

<Window x:Class="SOLineCharts.MainWindow"
        ....
        xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
        mc:Ignorable="d"
        WindowStartupLocation="CenterScreen"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ItemsControl Grid.Column="0" 
                      ItemsSource="{Binding CheckBoxCollection}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Vertical" ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
        <lvc:CartesianChart Series="{Binding SeriesCollection}" Grid.Column="1"/>
    </Grid>
</Window>

结果:

加载时:

enter image description here

取消选中一个复选框:

enter image description here