Silverlight / DataBinding / EntityRef

У меня была программа DataBinding, которая, на мой взгляд, является довольно распространенным явлением, но я не могу найти кого-либо с подобной проблемой - что заставляет меня думать, что я что-то упустил..

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

У меня есть иерархическая структура, которая выглядит следующим образом: Организация имеет одного или нескольких Представителей, где каждый Представитель является Лицом, каждый Лицо имеет ноль или более телефонных номеров.

Итак, Организация ->> Представитель-> Лицо ->> Телефонные номера.

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

Я использую службы WCF RIA, поэтому у меня есть объект Entity с именем Organization, который содержит коллекцию представителей EntitySet, которую я использую в качестве источника элементов для привязки к списку.

Внутри каждого представителя есть объект Person, который ведет меня к имени и фамилии человека (внутренне именно здесь EntityRef начинает играть).

В графе "Представитель" я хотел бы указать название представителя, а также связанные с ним имя и фамилию (которая относится к соответствующему лицу лица). Таким образом, список будет содержать что-то вроде этого:

Название Имя Фамилия Районный менеджер Билл Смит Региональный менеджер Джон Доу

XAML выглядит так:

 <ListBox> 
   <ListBox.ItemTemplate>
    <DataTemplate>
        <Grid>

           <Grid.ColumnDefinitions>

             <ColumnDefinition/>

             <ColumnDefinition/>

             <ColumnDefinition/>

           </Grid.ColumnDefinitions>

           <TextBlock Grid.Column="0" Text="{Binding ContactTitle}" Margin="5"/>

          <TextBlock Grid.Column="1" Text="{Binding Path=Person.FirstName, Mode=OneWay,    FallbackValue='New Representative'}" Margin="5"/>

          <TextBlock Grid.Column="2" Text="{Binding Path=Person.LastName, Mode=OneWay, FallbackValue='New Representative'}" Margin="5"/>

        </Grid>

     </DataTemplate>

  </ListBox.ItemTemplate>

</ListBox>

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

Все отлично работает, пока я не сохраню DomainContext. Когда я отправляю изменения обратно через RIA Services, я прослеживаю все это через Submit, и он обновляет DB, работает отлично. Представленные результаты, которые возвращаются после завершения операции отправки, также выглядят хорошо.

Я подтвердил, что Org, Rep и Person все правильно связаны в клиентском приложении.

ДА, когда я возвращаюсь в список, как имя, так и фамилия человека теряются! Я потратил часы и часы (фактически дни), пытаясь определить причину, но, похоже, не могу найти способ отследить, что происходит между Submitcallback и возвращением на экран.

В своей отладке я добавил обработчик события SelectionChanged и добавил точку останова. Когда я щелкаю по новой сохраненной строке и смотрю на Персона - она ​​не равна нулю и содержит правильные данные - но в списке отображается атрибут FallBack.

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

3 ответа

IMO, вы теряете привязку, я не уверен, но такая ситуация возникает, когда вы устанавливаете его данные вручную, пока они были связаны.

Это немного сложно. Для отладки привязки я использую фальшивый конвертор и помещаю точку останова в закомментированную строку, показанную ниже:

public class DummyConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value; // <- place you break point here
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

и вам нужно использовать его в вашем xaml:

<Grid>
    <Grid.Resources>
        <local:DummyConverter x:Key="DummyConv"/>
    </Grid.Resources>

    <TextBlock Text="{Binding MyText,Converter={StaticResource DummyConv}}"/>
</Grid>

и теперь вы можете видеть, как изменяется значение в конвертере, и если оно не достигает точки разрыва, это означает, что вы потеряли привязку (или у вас нет такого свойства в вашем DataContext)

Я думаю, что понимаю, почему это проблема, но я до сих пор не понимаю, почему это не большая проблема для многих людей.

Я использую суррогатные ключи, и эта проблема возникает только после отправки. Я довольно глубоко посмотрел, правильно ли клиентская модель DomainService хранит эти данные после добавления, и теперь я уверен, что это так.

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

Здесь я думаю, что одна сущность загружена, и, следовательно, свойства повышаются. Элемент управления отвечает на свойство подъема и получает данные. Это происходит, однако, до того, как "дочерняя" сущность загружается, и свойство навигации EntityRef возвращает нуль. Затем дочерние объекты загружаются непосредственно после этого, но поскольку привязка уже произошла на родительском объекте, элемент управления не "видит" данные.

Я обнаружил, что если я перепривязываю элемент управления (Silverlight), все появляется. Однако в MVVM это тесная связь между виртуальной машиной, завершающей нагрузку, и контролем, выполняющим повторное связывание. Я попытался повторно поднять свойства измененных событий, но элемент управления не отвечает.

Мне нужно будет потратить время на создание небольшого проекта с ошибкой и передать его в техподдержку для уточнения.

Другие вопросы по тегам