Проблема привязки пользовательского интерфейса WP7 Custom Class - PullRequest
1 голос
/ 04 февраля 2011

В моем приложении WP7 есть карта с MapItemsControl, которая содержит кнопки, привязанные к элементам в коллекции пользовательских классов.Вешки привязываются к свойствам элемента в коллекции с помощью DataTemplate.

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

Для иллюстрации я создампохожий пример:

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

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

Всякий раз, когда я добавляю или удаляюДля элементов из TempBox, все выводы отображаются так, как должны (например, если я указываю цвет в элементе коллекции, то вывод показывает цвет).

Нажатие на элемент вызывает триггер BoxTouched, который вызывает цвет элементаизменить в коллекции, но пользовательский интерфейс не изменится (цвет булавки остается прежним).

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

BoxControl.ItemsSource = Nothing
BoxControl.ItemsSource = TempBoxes

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

1 Ответ

1 голос
/ 04 февраля 2011

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

Посмотрите образцы VB в документации MSDN , если вы не знаете, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...