2011-02-04 3 views
1

У меня есть карта с MapItemsControl в моем приложении WP7, которая содержит кнопки, привязанные к элементам в коллекции пользовательских классов. Булавки привязаны к свойствам элемента в коллекции через DataTemplate.WP7 Custom Class UI Binding Issue

Когда элемент добавляется или удаляется из коллекции, все контакты отображаются правильно, со свойствами в соответствии с привязками, но при изменении свойств элементов пользовательский интерфейс не обновляется. Как правило, привязки получают значения из исходного элемента при загрузке, но я бы хотел, чтобы они обновляли элементы пользовательского интерфейса при обновлении свойств элементов исходной коллекции.

Чтобы проиллюстрировать это, я создам подобный пример:

Вот пользовательский класс:

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, что приводит к изменению цвета элемента в коллекции, но пользовательский интерфейс не изменяется (цвет контактов остается неизменным).

Чтобы получить пользовательский интерфейс, чтобы обновить цвет, я должен получить его снова делают булавки, добавляя что-то вроде этого, чтобы BoxTouched:

BoxControl.ItemsSource = Nothing 
BoxControl.ItemsSource = TempBoxes 

Я предполагаю, что есть лучший способ сделай это?

ответ

1

Чтобы ответить на изменения значений свойств вашего объекта данных, вам необходимо реализовать интерфейс INotifyPropertyChanged на вашем объекте данных, чтобы уведомление об изменении свойства повышалось при изменении свойств.

Взгляните на образцы VB в MSDN documentation, если вы не знаете, как это сделать.