简体   繁体   中英

How to refresh WPF Toolkit ColumnSeries Chart in real time

Application successfully Adds and Clears data from ColumnSeries WPF chart, but fails to re-add post Clear. Setting DataContext to null prior as advised elsewhere didn't resolve issue. Below is code and thanks for your assistance:

public partial class MainWindow : Window
{

    public MainWindow()
        {
            dataToChart = new Input();
            InitializeComponent();
            this.DataContext = dataToChart;
        }

    private void Button_Click_Clear(object sender, RoutedEventArgs e)
        {
            foreach (var series in columnChart.Series.OfType<Series>())
                {
                    series.DataContext = null;
                }
                columnChart.Series.Clear();
                dataToChart.Clear();
        }

    private void Button_Click_Add(object sender, RoutedEventArgs e)
        {
            dataToChart.Add(new KeyValuePair<string, int>("Test", 10));
        }
}

Input.cs

public class Input
{
    public ObservableCollection<KeyValuePair<string, int>> ValueList { get; private set; }

    public Input()
    {
        this.ValueList = new ObservableCollection<KeyValuePair<string, int>>();
    }

    public void Add(KeyValuePair<string, int> data)
    {
        ValueList.Add(data);
    }

    public void Clear()
    {
        ValueList.Clear();
    }
}

MainWindow.xaml

<Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" 
        x:Class="IES_Console.MainWindow"
        x:Name="wndMain" Title="IES Console" AllowsTransparency="True" WindowStyle="None"  WindowStartupLocation="Manual" ResizeMode="NoResize" Background="Transparent" Foreground="{x:Null}" Loaded="Window_Loaded" Closing="Window_Closing" KeyUp="Window_KeyUp" MouseLeftButtonDown="Window_MouseLeftButtonDown" SizeChanged="Window_SizeChanged" LocationChanged="Window_LocationChanged" Icon="/IES%20Console;component/48x48.ico" MouseLeave="wndMain_MouseLeave" mc:Ignorable="d" FontFamily="Arial" Width="Auto" Height="Auto" SizeToContent="WidthAndHeight">


    <Grid x:Name="MainGrid" Background="Black" ShowGridLines="False" Width="531" Height="700"  VerticalAlignment="Top" HorizontalAlignment="Left">

        <!--Code taken out for simplicity-->


        <Grid x:Name="subFooter" Grid.Row="3" Background =" Black" Margin="0,20,0,-144">


            <TextBlock x:Name="textBlock1"  VerticalAlignment="top" Margin="10,10,0,0" TextWrapping="Wrap" 
                Text="TextBlock" Foreground="White" Width="511" Height="50"/>

            <chartingToolkit:Chart Height="262" HorizontalAlignment="Left" 
                                   Margin="33,0,0,10" Name="columnChart" Title="Column Series Demo" 
                                   VerticalAlignment="Bottom" Width="360">

                <chartingToolkit:ColumnSeries  DependentValuePath="Value" Visibility="Visible"
                                        IndependentValuePath="Key" ItemsSource="{Binding ValueList}" />

                <chartingToolkit:Chart.LegendStyle>
                    <Style TargetType="Control">
                        <Setter Property="Width" Value="0" />
                        <Setter Property="Height" Value="0" />
                    </Style>
                </chartingToolkit:Chart.LegendStyle>

            </chartingToolkit:Chart>

            <Button Content="Data Clear" HorizontalAlignment="Left" Margin="426,65,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_Clear"/>
            <Button Content="Data Add" HorizontalAlignment="Left" Margin="426,108,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_Add"/>

        </Grid>
    </Grid>
</Window>

The problem is with the code

private void Button_Click_Clear(object sender, RoutedEventArgs e)
{
    foreach (var series in columnChart.Series.OfType<Series>())
    {
        series.DataContext = null;
    }
    columnChart.Series.Clear();
    dataToChart.Clear();
}
  1. You're setting the DataContext to null , but you're not reassigning it afterwards, leaving the data feed broken.
  2. The line columnChart.Series.Clear() wipes out the ColumnSeries you declared in XAML. Again, not reassigning causes the chart to remain blank.

You could overcome both issues using

private void Button_Click_Clear(object sender, RoutedEventArgs e)
{
    dataToChart.Clear();
    foreach (var series in columnChart.Series.OfType<Series>())
    {
        series.DataContext = null;
        series.DataContext = dataToChart;
    }
}

Of course, in case of multiple series with different DataContext , you'd need to reassign the right Input to the corresponding series.DataContext .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM