2016-05-16 109 views
0

我有一個名爲ShellViewModel的類和一個名爲Shell.xaml的WPF頁面。在我的ShellViewModel中,我有一個函數,用於從.csv文件中讀取數據,並將數據顯示在Shell.xaml中的數據網格中。數據在圖形上繪製爲線圖。System.ArgumentException:'Value'屬性已被'Point'註冊

文件讀取正常,數據在數據網格上正確顯示。數據的結構有25列。第一列是數據的名稱,接下來的24列是數據點。雖然數據在數據網格中正確顯示,但圖形中沒有數據點。

這是我的圖的代碼。我得到的錯誤是:

筆記「

System.ArgumentException‘值’屬性已經由‘點’註冊」: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.x反洗錢:

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

回答

1

簡單:你傳遞一個錯誤的參數DependencyProperty.Register。由於複製和粘貼,我一週做兩次。

public static readonly DependencyProperty _value = 
    DependencyProperty.Register("Value", 
     typeof(decimal), 
     typeof(ForecastPoint)); 

最後一個參數是你的片斷typeof(Point),但它需要typeof(ForecastPoint) - 聲明類的類型,因爲它是一個幾行字上面有,你註冊Hour財產。

順便說一句,我會命名那些ValuePropertyHourProperty而不是_value_hour。這是慣例,這是人們期望看到的。任何試圖撥打obj.SetValue(ForecastPoint.ValueProperty, value)的人都會遇到一些不必要的沮喪。

+0

非常感謝你 – someone

+0

@someone如果這個答案解決了你的問題,你應該把它標記爲正確的答案。 –