5

我使用 Microsoft 的 WPF 工具包的图表控件来编写自己的图表控件。我在这里写了博客。我的图表控件将图表中的 yaxes 堆叠在一起。正如您在文章中所读到的,这一切都很好。现在我想创建一个视图模型来控制图表中的数据和轴。到目前为止,我能够将轴添加到图表中并在图表中显示它们。但是当我尝试添加lineseries 时遇到问题,因为它有一个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
}

视图模型都有自己的数据模板。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>

这段代码工作得很好。当我添加轴时,它们会被绘制。但是lineseries 控件的DependentAxis 和InDependentAxis 保持为空,因此不会绘制系列。如何将嵌套视图模型绑定到控件的属性?

4

2 回答 2

1

您可能已经检查过这个,但我发现当我调试绑定时,第一个也是最容易开始的地方是从 VS 运行调试会话,因为调试输出告诉哪些对象和属性无法绑定。我通常最终发现我需要显式设置 DataContext 或其他类似错字的东西。要查找的输出如下所示:

System.Windows.Data 错误:39:BindingExpression 路径错误:

这后面是您尝试绑定的属性名称,通常最重要的是它实际尝试绑定的类。如果这没有帮助,这里有一篇关于调试绑定的精彩文章:http ://www.beacosta.com/blog/? p=52 讨论了 Aelij 提到的 PresentationTraceSources.TraceLevel=High 的使用,以及其他一些技术。希望这能走上正确的轨道。

问候,

麦克风

于 2010-04-14T03:54:42.490 回答
1

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

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

希望有帮助,

埃利杰。

于 2010-03-07T12:35:39.660 回答