我有一组函数,我想在画布上绘制它们。所以我认为绘制这些函数的正确数据类型是Polyline
。
所以我需要一个转换器将这些函数转换为折线的集合,最后在画布中显示它们。
这是XAML代码。
<ItemsControl ItemsSource="{Binding WaveCollection,
RelativeSource ={RelativeSource FindAncestor, AncestorType={x:Type Window}},
Converter={StaticResource PlotterConverter}}" Margin="10,10,0,239" HorizontalAlignment="Left" Width="330">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Background="GhostWhite" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
这是转换器的一部分,它将波形转换为折线。绑定模式是一种方式。
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var collection = value as IEnumerable<Waveform>;
return new ObservableCollection<Polyline>(GetPlots(collection));
}
然而,当我提出断点时,我注意到它只在程序启动时触发一次。该集合是空的,所以没有特别的事情发生,但在那之后,当我添加项目收集时没有任何事情发生。没有事件发生。为什么呢?
为了确保我还将此代码添加到转换器中以查看它是否真的触发但没有发生任何事情。
var collection = value as ObservableCollection<Waveform>;
collection.Clear(); // this is supposed to clear collection. if binding works correct!
//...
请注意,我还将此集合绑定到listview
,以显示在集合更新时正常工作的wave信息。
编辑:
我想问题是这部分return new ObservableCollection<Polyline>...
会在第一次运行中更改集合并且会破坏绑定吗?
答案 0 :(得分:3)
不要一次转换整个ObservableCollection
,而是使用一次转换一个项目的转换器。
在这种情况下,这意味着您通过在XAML中定义ItemsControl
的{{1}}来指定每个项目应显示的控件类型:
ItemTemplate
<ItemsControl ItemsSource="{Binding WaveCollection,
RelativeSource ={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" Margin="10,10,0,239" HorizontalAlignment="Left" Width="330">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Background="GhostWhite" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Polyline Points="{Binding, Converter={StaticResource PlotterConverter}}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
现在将自己传递每个项目,因此它需要做的就是将PlotterConverter
对象转换为Waveform
类型的对象(因为{{1} } PointCollection
属性的类型为Polyline
}:
Points
当然,PointCollection
方法也需要调整。