Проблема обновления DataGrid - PullRequest
0 голосов
/ 07 февраля 2012

У меня есть Silverlight 4 DataGrid , у которого ItemsSource связан с ObservableCollection .Когда я изменяю элемент моего ObservableCollection , измененный элемент корректно отображается внутри моей сетки, за исключением элемента одного столбца .Этот столбец отличается от других тем, что он TemplateColumn и использует ValueConverter .

Шаблон для столбца состоит из простой stackPanelэто включает в себя элемент управления Path и метку.И Метка привязана к некоторому объекту-источнику с помощью простого ValueConverter.

Проблема теперь заключается в том, что когда я изменяю какой-либо элемент, который принадлежит ObservableCollection, все столбцы сетки отображаются правильно, кромеодин описан выше.Он просто остается неизменным - но когда я использую курсор мыши, чтобы выбрать DataGridCell и щелкнуть по нему второй раз, неожиданно происходит желаемое обновление.

Так что я предполагаю, что это что-то простое, чего мне здесь не хватает, но я могу »не могу найти ...

Заранее спасибо ..

РЕДАКТИРОВАТЬ:

Тем временем я смог найтипроблема: кажется, что после того, как я изменяю элемент моей ObservableCollection, соответствующий ValueConverter, принадлежащий метке в моей сетке, связанной с источником, просто не вызывается.Когда я щелкаю внутри ячейки, ValueConverter вызывается, как и должно быть.НО это не будет автоматически - так как мне этого добиться?пожалуйста, помогите:)

РЕДАКТИРОВАТЬ:

Привязка:

<sdk:Label Content="{Binding Route.Legs, Converter={StaticResource IncomingTableRouteTripConverter}}" Margin="9,0,0,0" Style="{StaticResource TripLabelTemplate}" FontFamily="Arial" FontSize="10.667" Padding="0" Height="10" FontWeight="Bold" />

Это код моего ValueConverter: (Но я не думаю, что код конвертера имеет какое-либо отношение к моей проблеме, я только разместил его здесь для полноты)

public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {

        string trip = "";

        if (value != null) {


            List<Leg> legs = (List<Leg>)value;

            if (legs.Count >= 1) {

                for (int i = 0; i <= legs.Count - 1; i++) {

                    trip += ((Leg)legs[i]).Start.ICAO + " - " + ((Leg)legs[i]).Stop.ICAO + " - ";
                }

                trip = trip.Substring(0, trip.Length - 2);
            }
        }

        return trip;
    }

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

Для всех узлов в Path уведомления должны быть на месте, поэтому и класс, владеющий Route, и класс, владеющий Legs, должны реализовать INPC.

Далее, если вы добавляете элементы в список Legs, естественно, ничего не будет обновлено, фактически, даже если бы свойство Legs было типа ObservableCollection<...>, это не имело бы значения, поскольку механизм привязки заботится только о INPC.

Таким образом, если вы хотите, чтобы привязка обновлялась при изменении коллекции, вам нужно запускать свойство, изменяемое для свойства Legs каждый раз, когда оно каким-либо образом изменяется (включая полную замену ссылки).

0 голосов
/ 07 февраля 2012

Если вы используете как

Content = "{Binding Path = Converter Parameter = {StaticResource SomeConverter}}"

, тогда ваша проблема может быть решена ...

...