2009-10-22 17 views
5

Microsoftのチャートコントロールを使用して独自のチャートコントロールを作成しました。 私はそれについてブログしましたhere。 My Chartコントロールは、チャート内のyaxesを重ねて重ねて表示します。あなたが記事で読むことができるように、これはすべてうまくいきます。次に、グラフのデータと軸を制御するビューモデルを作成します。これまでは、グラフに軸を追加してチャートに表示することができました。しかし、1つのDependentAxisプロパティと1つの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> 

このコードは非常によく動作します。私は軸を追加するときに描画されます。しかし、LineeriesコントロールのDependentAxisとInDependentAxisはnullのままなので、シリーズは描画されません。どのようにして、ネストされたビューモデルをコントロールのプロパティにバインドできますか?

答えて

0

正常に動作するはずです。あなたがチェックできるいくつかの事柄:

  • シリーズバインディングは機能しますか?そうであれば、違いが何であるか把握してみてください。
  • XAxisプロパティとYAxisプロパティに実際に値が設定されていますか?ゲッターにブレークポイントを入れてみてください。それに達すると、バインディングが機能します。 Binding(IValueConverter)をBinding(単に受け取った値を返す)に置き、そこでブレークポイントを配置することもできます。
  • バインディングでPresentationTraceSources.TraceLevel = Highを使用すると、より詳細なトレース(VS出力ウィンドウに表示されます)を取得できます。
  • DependentAxis/IndependentAxはFastLineSeriesの依存関係プロパティとして定義されていますか?助け

希望、

Aelij。

1

あなたは既にこれをチェックしていますが、私がバインディングをデバッグしている最中に、デバッグ出力がバインドに失敗したオブジェクトとプロパティを示すので、VSからデバッグセッションを開始するのが最も簡単です。私は通常、私が明示的にDataContextまたはタイプミスのような何かを設定する必要があることを発見してしまいます。出力は次のようにスタートを探すために:

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

これは、あなたが最も重要なのは通常、そのが実際にバインドしようとし、それに対してクラスに結合してしようとしたプロパティ名が続きます。これが役に立たない場合は、デバッグバインディングに関する素晴らしい記事があります:http://www.beacosta.com/blog/?p=52ここでは、Aelijが述べたPresentationTraceSources.TraceLevel = Highの使用方法や他のいくつかの手法について説明しています。これが正しい軌道に乗ることを願っています。

よろしく、

マイク

関連する問題