我的应用程序在一组点上有一条线,每个点都有一个图标。我在Canvas元素中有以下XAML:
<!-- A route line -->
<Polyline Canvas.ZIndex="1" Stroke="Green" StrokeThickness="5" Points="{Binding SelectedRoute.Items, Converter={StaticResource routePointsConverter}}"></Polyline>
<!-- The icons on a route line -->
<ItemsControl Canvas.ZIndex="2" ItemsSource="{Binding SelectedRoute.Items}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding X, Converter={StaticResource canvasIconCenterConverter}}"/>
<Setter Property="Canvas.Top" Value="{Binding Y, Converter={StaticResource canvasIconCenterConverter}}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Image Source="Graphics\Icons\x.png" Width="20" Height="20"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
SelectedRoute.Items是一个ObservableCollection。问题是当将项目添加到SelectedRoute.Items时,Polyline不会更新。将项目添加到项目时添加图标。如果我将SelectedRoute的绑定项更改为另一个然后返回,则也会正确绘制该行。这似乎是Polyline的一个问题。
当我调试时,我可以看到添加项目时不会调用Polyline的转换器。为什么会这样?
请注意,我找到了一种解决方法,但我想了解它为什么不能在所显示的解决方案中工作。
答案 0 :(得分:0)
WPF只为INotifyCollectionChanged
属性注册ItemsControl.ItemsSource
个更新。它实际上与Binding
扩展名无关。您甚至可以直接(即没有Binding
)将ItemsSource
属性分配给实现INotifyCollectionChanged
的集合,并且会通知items控件对该集合的更改。
要更新Points
绑定,Items
属性必须触发PropertyChanged
事件。你可以手动发射#34;每次你改变收藏品。