Silverlight / DataBinding / EntityRef - PullRequest
2 голосов
/ 12 июня 2011

У меня была программа 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 все правильно связаны в клиентском приложении.

YET, когда я возвращаюсь в список, и имя, и фамилияЧеловек ПОТЕРЯЛ!Я потратил часы и часы (фактически дни), пытаясь определить причину, но, похоже, не могу найти способ отследить, что происходит между Submitcallback и возвращением на экран.

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

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

Ответы [ 3 ]

1 голос
/ 14 июня 2011

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

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)

1 голос
/ 13 июня 2011

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

0 голосов
/ 13 июля 2011

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

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

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

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

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

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

...