我有一个名为ShellViewModel的类和一个名称为Shell.xaml的WPF页面。在我的ShellViewModel中,我有一种函数,可以从.csv文件中读取数据,并将数据显示到Shell.xall中的数据网格中。数据在图上以折线图的形式绘制。
文件读取良好,数据在数据网格上正确显示。数据的结构有25列。第一列是数据的名称,接下来的24列是数据点。尽管数据在数据网格中正确显示,但图形中没有数据点。
这是我的图形的代码。我得到的错误是"
System.ArgumentException:"Value"属性已由"Point"注册"
注意:obsLoadForecasts存储的数据将显示在数据网格中
来自ShellViewModel.cs的图形代码:
public void UpdateLoadChart()
{
var forecastList = obsLoadForecasts.ToList();
var dataList = new List<ForecastPoint>();
forecastList.Where(a => a.ObsForecast.ZoneName == zoneName).ToList().ForEach(a =>
{
dataList.Add(new ForecastPoint(1, a.ObsForecast.Hr1));
dataList.Add(new ForecastPoint(2, a.ObsForecast.Hr2));
dataList.Add(new ForecastPoint(3, a.ObsForecast.Hr3));
dataList.Add(new ForecastPoint(4, a.ObsForecast.Hr4));
dataList.Add(new ForecastPoint(5, a.ObsForecast.Hr5));
dataList.Add(new ForecastPoint(6, a.ObsForecast.Hr6));
dataList.Add(new ForecastPoint(7, a.ObsForecast.Hr7));
dataList.Add(new ForecastPoint(8, a.ObsForecast.Hr8));
dataList.Add(new ForecastPoint(9, a.ObsForecast.Hr9));
dataList.Add(new ForecastPoint(10, a.ObsForecast.Hr10));
dataList.Add(new ForecastPoint(11, a.ObsForecast.Hr11));
dataList.Add(new ForecastPoint(12, a.ObsForecast.Hr12));
dataList.Add(new ForecastPoint(13, a.ObsForecast.Hr13));
dataList.Add(new ForecastPoint(14, a.ObsForecast.Hr14));
dataList.Add(new ForecastPoint(15, a.ObsForecast.Hr15));
dataList.Add(new ForecastPoint(16, a.ObsForecast.Hr16));
dataList.Add(new ForecastPoint(17, a.ObsForecast.Hr17));
dataList.Add(new ForecastPoint(18, a.ObsForecast.Hr18));
dataList.Add(new ForecastPoint(19, a.ObsForecast.Hr19));
dataList.Add(new ForecastPoint(20, a.ObsForecast.Hr20));
dataList.Add(new ForecastPoint(21, a.ObsForecast.Hr21));
dataList.Add(new ForecastPoint(22, a.ObsForecast.Hr22));
dataList.Add(new ForecastPoint(23, a.ObsForecast.Hr23));
dataList.Add(new ForecastPoint(24, a.ObsForecast.Hr24));
});
ObsLoadChartData = dataList;
RaisePropertyChanged("ObsLoadChartData");
if (!(obsLoadForecasts.Exists(a => a.ObsForecast.ZoneName.Contains("Interchange"))))
{
try
{
//Peak Load Forecast values defined
maxRTOvalue = dataList.Max(ForecastPoint => ForecastPoint.Value);
maxRTOhour = dataList.FindIndex(ForecastPoint => ForecastPoint.Value == maxRTOvalue);
maxRTOhour = maxRTOhour + 1;
}
catch
{
Log("Unable to determine Peak Load Forecast ");
maxRTOvalue = 0;
maxRTOhour = 0;
maxRTOhour = 0;
}
}
}
public class ForecastPoint : DependencyObject
{
public ForecastPoint(int hour, decimal value)
{
Hour = hour;
Value = value;
}
public static readonly DependencyProperty _hour = DependencyProperty.Register("Hour", typeof(Int32), typeof(ForecastPoint));
public Int32 Hour
{
get { return (int)GetValue(_hour); }
set { SetValue(_hour, value); }
}
public static readonly DependencyProperty _value = DependencyProperty.Register("Value", typeof(decimal), typeof(Point));
public decimal Value
{
get { return (decimal)GetValue(_value); }
set { SetValue(_value, value); }
}
}
Shell.xaml:中的代码
<me:LoadChart x:Name="MyLoadChart" SnapsToDevicePixels="True" />
LoadChart.xaml:中的代码
<UserControl x:Class="ProbeCTO.LoadChart"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:charting="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
xmlns:chartingPrimitives="clr-namespace:System.Windows.Controls.DataVisualization.Charting.Primitives;assembly=System.Windows.Controls.DataVisualization.Toolkit"
xmlns:datavis="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit"
xmlns:me="clr-namespace:ProbeCTO"
mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<Style TargetType="{x:Type charting:Chart}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type charting:Chart}">
<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<datavis:Title Content="{TemplateBinding Title}" HorizontalAlignment="Left" Margin="20 0" FontWeight="Bold" Foreground="{StaticResource DefaultButtonBrush}" Style="{TemplateBinding TitleStyle}" />
<!-- Use a nested Grid to avoid possible clipping behavior resulting from ColumnSpan+Width=Auto -->
<Grid Grid.Row="1" Margin="0,15,0,15">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<chartingPrimitives:EdgePanel x:Name="ChartArea" Style="{TemplateBinding ChartAreaStyle}">
<Grid Canvas.ZIndex="-1" Style="{TemplateBinding PlotAreaStyle}" />
<Border Canvas.ZIndex="10" BorderBrush="#FF919191" BorderThickness="1 0 0 1" />
</chartingPrimitives:EdgePanel>
</Grid>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Grid>
<charting:Chart x:Name="MyChart" Title="{Binding ObsSelectedLoadForecast.ObsForecast.ZoneName, TargetNullValue=RTO, FallbackValue=RTO}" Grid.Row="1" SnapsToDevicePixels="True" Foreground="#DDD" BorderThickness="0">
<charting:Chart.PlotAreaStyle>
<Style TargetType="{x:Type Grid}">
<Setter Property="Background" Value="{x:Null}" />
</Style>
</charting:Chart.PlotAreaStyle>
<charting:Chart.Axes>
<charting:LinearAxis Orientation="X" ShowGridLines="False" Interval="1" />
<charting:LinearAxis Orientation="Y" ShowGridLines="False" />
</charting:Chart.Axes>
<charting:Chart.Series>
<charting:AreaSeries ItemsSource="{Binding ObsLoadChartData}"
IndependentValuePath="Hour"
DependentValuePath="Value">
</charting:AreaSeries>
<charting:LineSeries ItemsSource="{Binding ObsLoadChartData}"
IndependentValuePath="Hour"
DependentValuePath="Value">
</charting:LineSeries>
</charting:Chart.Series>
</charting:Chart>
</Grid>
Easy:您向DependencyProperty.Register
传递了一个错误的参数。多亏了复制粘贴,我一周做两次。
public static readonly DependencyProperty _value =
DependencyProperty.Register("Value",
typeof(decimal),
typeof(ForecastPoint));
最后一个参数是代码段中的typeof(Point)
,但它需要是typeof(ForecastPoint)
——声明类的类型,因为它是上面几行注册Hour
属性的地方。
顺便说一句,我将这些命名为ValueProperty
和HourProperty
,而不是_value
和_hour
。这是惯例,也是人们期望看到的。任何试图拨打obj.SetValue(ForecastPoint.ValueProperty, value)
的人都会遇到一些不必要的小挫折。