当项添加到绑定的ObservableCollection时,不会调用WPF Polyline的转换器

时间:2014-04-29 04:16:17

标签: c# wpf binding polyline

我的应用程序在一组点上有一条线,每个点都有一个图标。我在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的转换器。为什么会这样?

请注意,我找到了一种解决方法,但我想了解它为什么不能在所显示的解决方案中工作。

1 个答案:

答案 0 :(得分:0)

WPF只为INotifyCollectionChanged属性注册ItemsControl.ItemsSource个更新。它实际上与Binding扩展名无关。您甚至可以直接(即没有Binding)将ItemsSource属性分配给实现INotifyCollectionChanged的集合,并且会通知items控件对该集合的更改。

要更新Points绑定,Items属性必须触发PropertyChanged事件。你可以手动发射#34;每次你改变收藏品。