我的WP7应用程序中有一个MapItemsControl地图,其中包含绑定到自定义类集合中的项目的图钉。图钉通过DataTemplate绑定到集合中项目的属性。
当在集合中添加或删除项目时,所有引脚都会正确显示,并且按照绑定显示属性,但是当仅修改项目的属性时,UI不会更新。绑定似乎只是在加载时从源项获取值,但我希望它们在源集合项的属性更新时保持UI元素的更新。
为了说明,我将创建一个类似的例子:
这是一个自定义类:
Public Class Box
Property CurrentColor As Color
Property Location As GeoCoordinate
End Class
有一个集合:
Dim TempBoxes As ObservableCollection(Of Box)
我的地图控件中有一个MapItemsControl:
<maps:MapItemsControl Name="BoxControl"
ItemTemplate="{StaticResource BoxTemplate}"
ItemsSource="{Binding TempBoxes}"/>
项目模板是这样的:
<DataTemplate x:Key="BoxTemplate">
<maps:Pushpin Location="{Binding Location}" ManipulationStarted="BoxTouched">
<maps:Pushpin.Template>
<ControlTemplate>
<Ellipse Width="35" Height="35" Margin="54,148,366,584"
Stretch="Fill" StrokeThickness="4" Stroke="Black"
Fill="{Binding CurrentColor}" />
</ControlTemplate>
</maps:Pushpin.Template>
</maps:Pushpin>
</DataTemplate>
触摸事件处理程序在蓝色和红色之间切换引脚的颜色:
Private Sub BoxTouched(ByVal sender As Object, ByVal e As RoutedEventArgs)
With DirectCast(DirectCast(sender, Pushpin).DataContext, Box)
If .CurrentColor = Colors.Red Then
.CurrentColor = Colors.Blue
Else
.CurrentColor = Colors.Red
End If
End With
End Sub
每当我在TempBoxes中添加或删除项目时,引脚都会按照应有的方式呈现(例如,如果我在集合项中指定了颜色,则引脚会显示颜色)。
点击该项会触发BoxTouched子,这会导致项目的颜色在集合中发生变化,但UI不会改变(引脚颜色保持不变)。
要让UI更新颜色,我必须通过向 BoxTouched 添加类似的内容来再次渲染引脚:
BoxControl.ItemsSource = Nothing
BoxControl.ItemsSource = TempBoxes
我认为有更好的方法吗?
答案 0 :(得分:1)
为了让DataTemplate
响应数据对象的属性值更改,您需要在数据对象上实现INotifyPropertyChanged
接口,以便在属性更改时引发属性更改通知。
如果您不确定如何执行此操作,请查看MSDN documentation中的VB示例。