2009-10-22 85 views
5

我使用Microsoft的图表控件的WPF工具包来编写我自己的图表控件。 我对此博文here。我的图表控件将图表中的yax堆叠在一起。正如你可以在文章中看到的,这一切都很好。现在我想创建一个控制图表中数据和坐标轴的视图模型。到目前为止,我可以将轴添加到图表并在图表中显示它们。但是当我尝试添加线路系列时,我遇到了一个问题,因为它有一个DependentAxis和一个InDependentAxis属性。我不知道如何为它分配正确的xAxis和yAxis控件。
下面你看到LineSeriesViewModel的一部分。它有一个嵌套的XAxisViewModel和YAxisViewModel属性。如何将嵌套的视图模型绑定到控件的属性

public class LineSeriesViewModel : ViewModelBase, IChartComponent 
{ 

    XAxisViewModel _xAxis; 
    public XAxisViewModel XAxis 
    { 
     get { return _xAxis; } 
     set 
     { 
      _xAxis = value; 
      RaisePropertyChanged(() => XAxis); 
     } 
    } 

    //The YAxis Property look the same 
} 

该viewmodels都有自己的数据模板。 的XAML代码如下所示:

<UserControl.Resources> 
    <DataTemplate x:Key="xAxisTemplate" DataType="{x:Type l:YAxisViewModel}"> 
     <chart:LinearAxis x:Name="yAxis" Orientation="Y" Location="Left" Minimum="0" Maximum="10" IsHitTestVisible="False" Width="50" /> 
    </DataTemplate> 
    <DataTemplate x:Key="yAxisTemplate" DataType="{x:Type l:XAxisViewModel}"> 
     <chart:LinearAxis x:Name="xAxis" Orientation="X" Location="Bottom" Minimum="0" Maximum="100" IsHitTestVisible="False" Height="50" /> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type l:LineSeriesViewModel}"> 
     <!--Binding doesn't work on the Dependent and IndependentAxis! --> 
     <!--YAxis XAxis and Series are properties of the LineSeriesViewModel --> 
     <l:FastLineSeries DependentAxis="{Binding Path=YAxis}" 
          IndependentAxis="{Binding Path=XAxis}" 
          ItemsSource="{Binding Path=Series}"/> 
    </DataTemplate> 
    <Style TargetType="ItemsControl"> 
     <Setter Property="ItemsPanel"> 
      <Setter.Value> 
       <ItemsPanelTemplate> 
        <!--My stacked chart control --> 
        <l:StackedPanel x:Name="stackedPanel" Width="Auto" Height="Auto" Background="LightBlue"> 
        </l:StackedPanel> 
       </ItemsPanelTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ClipToBounds="True"> 
    <!-- View is an ObservableCollection of all axes and series--> 
    <ItemsControl x:Name="chartItems" ItemsSource="{Binding Path=View}" Focusable="False"> 
    </ItemsControl> 
</Grid> 

此代码工作得很好。当我添加轴时,他们会绘制。但是系列控件的DependentAxis和InDependentAxis保留为null,所以系列不会被绘制。我如何将嵌套的viewmodels绑定到控件的属性?

回答

0

它应该工作。几件事你可以检查:

  • 系列绑定工作?如果是这样,试图找出有什么不同。
  • 您确定XAxis和YAxis属性实际上有值吗?尝试在getter中放置一个断点。如果达到了,绑定就起作用。你也可以在Binding上放置一个转换器(IValueConverter)(它只是返回它接收到的值)并在那里放置一个断点。
  • 在Binding上使用PresentationTraceSources.TraceLevel = High以获得更详细的跟踪(将出现在VS Output窗口中)。
  • DependentAxis/IndependentAxis是否定义为FastLineSeries上的依赖项属性?

希望帮助,

Aelij。

1

你可能已经检查过这个,但是我发现当我调试绑定时,第一个也是最简单的地方就是从VS开始调试会话,因为调试输出告诉哪些对象和属性无法绑定。我通常最终发现我需要明确地设置DataContext或其他类似错误的东西。输出去寻找这样开始:

System.Windows.Data Error: 39 : BindingExpression path error:

这之后你试图结合并通常最重要的针对其其实际上是试图绑定类的属性名称。如果这没有帮助,那么这里有一篇关于调试绑定的伟大文章:http://www.beacosta.com/blog/?p=52,其中讨论了Aelij提到的PresentationTraceSources.TraceLevel = High的使用以及其他一些技巧。希望这走上正轨。

问候,

迈克

相关问题