I am using 8.0.3712.22025.
Here is an example:
The Person type has the Name and the Age notify properties.
public class Person : INotifyPropertyChanged
{
private int age;
private string name;public Person(string name, int age)
{
this.name = name;this.age = age;
}
public event PropertyChangedEventHandler PropertyChanged;public int Age
{
get
{
return this.age;
}
set
{
if (this.age != value)
{
this.age = value;this.OnPropertyChagned("Age");
}
}
}
public string Name
{
get
{
return this.name;
}
set
{
if (this.name != value)
{
this.name = value;this.OnPropertyChagned("Name");
}
}
}
protected virtual void OnPropertyChagned(string propName)
{
var h = this.PropertyChanged;if (h != null)
{
h(this, new PropertyChangedEventArgs(propName));
}
}
}
The Chart window has a simple chart, a load button to reload the data and a change button to modify the first Person's Age.
<
Window
x:Class="ChartFXWpfApplication1.ChartNotStopListenPropChange"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1"
Height="480"
Width="640"
xmlns:cfx="http://schemas.softwarefx.com/chartfx/wpf/80">
<Window.Resources>
</Window.Resources><Grid>
<cfx:Chart Name="chart1">
<cfx:Chart.AxesX>
<cfx:Axis>
<cfx:Axis.Title>
<cfx:Title Content="Name" />
</cfx:Axis.Title>
<cfx:Axis.Labels>
<cfx:AxisLabelAttributes BindingPath="Name" />
</cfx:Axis.Labels>
</cfx:Axis>
</cfx:Chart.AxesX>
<cfx:Chart.AxesY>
<cfx:Axis>
<cfx:Axis.Title>
<cfx:Title Content="Age" />
</cfx:Axis.Title>
</cfx:Axis>
</cfx:Chart.AxesY>
</cfx:Chart>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Bottom">
<Button x:Name="Reload" Content="Reload" Click="Reload_Click"/>
<Button x:Name="Change" Content="Change" Click="Change_Click"/>
</StackPanel></Grid>
</
Window>And the code behind:
public partial class ChartNotStopListenPropChange : Window
{
private Random r = new Random();
private List<Person> source = null;public ChartNotStopListenPropChange()
{
InitializeComponent();
this.source = new List<Person>(new[] { new Person("Foo", r.Next(1, 100)) });this.load();
}
private void AddSeries(IEnumerable<Person> source, Gallery gallery, int? index)
{
var series1 = new SeriesAttributes();
series1.ItemsSource = source;
series1.Gallery = gallery;
series1.Content = "Person";series1.BindingPath = "Age";
chart1.Series.Add(series1);
}
private void Change_Click(object sender, RoutedEventArgs e)
{
this.source[0].Age += 1;
}
private void Clear()
{
foreach (var s in chart1.Series)
{
s.ItemsSource = null;
}
chart1.Series.Clear();
chart1.ItemsSource = null;
}
private void load()
{
Clear();
AddSeries(this.source, Gallery.Bar, 1);
}
private void Reload_Click(object sender, RoutedEventArgs e)
{
this.load();
}
}
To repro:
1. Start the application
2. Click the Reload button
3. Click the Change button
At step 3, NullReferenceException was unhandled.