我正在尝试用WPF绘制一些散点图,并努力绘制图表轴上通常存在的小tick痕迹。我的视图模型在每个轴上使用List<Tick>
定义了tick的位置,其中每个Tick
项目只是tick落在轴上的笛卡尔坐标。我有一个IMultiValueConverter
,它使用画布大小将单点转换为可以渲染的线对象...但是如何绑定它?WPF希望我指定X1,X2,Y1和Y2,但我只想将其列出。
我的想法是定义以下数据模板,但是它不会编译,因为我不能直接给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>
您可以将ContentControl的Content
属性绑定到从您的转换器返回的行中,但是IMO转换器不应处理UIELEMENTS。通常应避免在背后的代码中创建和操纵插管。
最好从转换器返回线条计,并将路径的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>