2016-11-23 10 views
0

私はWPFでいくつかの散布図を描画しようとしており、通常はチャート軸上に小さな目盛りを描こうとしています。私のビューモデルは、軸ごとにを使用してティックの位置を定義します。各Tickの項目は、ティックが軸上に落ちる位置のデカルト座標です。私はIMultiValueConverterキャンバスサイズを使用して、単一のポイントをレンダリングできるLineオブジェクトに変換していますが、どのようにバインドしますか? WPFは私にX1、X2、Y1、およびY2を指定したいと思っていますが、私はただその行を与えたいだけです。WPF - ラインを返すコンバーターでラインをバインドする

私の考えは、以下のようなデータテンプレートを定義することでしたが、Lineに直接マルチバインドを与えることができないため、コンパイルできません。私が使用できる中間要素/属性はありますか?

<DataTemplate DataType="{x:Type viewModel:Tick}" x:Key="TickTemplate"> 
     <Line> 
      <WhatsMissing?> 
       <MultiBinding Converter="{StaticResource PointsConverter}"> 
        <Binding Path="Points"/> 
        <Binding Path="DataContext.MinPoint" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}"/> 
        <Binding Path="DataContext.MaxPoint" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}"/> 
        <Binding Path="ActualWidth" ElementName="ChartCanvas"/> 
        <Binding Path="ActualHeight" ElementName="ChartCanvas"/> 
       </MultiBinding> 
      </WhatsMissing?> 
     </Line> 
    </DataTemplate> 

答えて

1

あなたがラインにContentControlにのContentプロパティをバインドすることができ、あなたコンバータから戻ったが、IMOコンバータはのUIElementを扱うべきではありません。コードの背後にあるUIElementsの作成と操作は、一般的に避けなければなりません。

より良いあなたのコンバータからLineGeometryを返し、結果へのパスのDataプロパティをバインド:

<DataTemplate DataType="{x:Type viewModel:Tick}" x:Key="TickTemplate"> 
    <Path Stroke="Black" StrokeThickness="1"> 
     <Path.Data> 
      <MultiBinding Converter="{StaticResource PointsConverter}"> 
       ... 
      </MultiBinding> 
     </Path.Data> 
    </Path> 
</DataTemplate>