Перекрестный список доменов DataSataSource Привязка выбранного элемента - PullRequest
4 голосов
/ 16 февраля 2011

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

В моем проекте RIA SL4 у меня есть две сущности PackageOS и OS, где PackageOS имеет связь с OS через * 1007.* (связывание с помощью PackageOS.OSID <-> OS.ID - и [Include] + .Include(), правильно настроенных на соответствующих разделах)

Это шаблон (определенный в разделе Page.Resource вместе со всеми другими вовлеченнымиDDS) Я использую в DataForm для получения OSEntities List для привязки к PackageOS Entity (из RIA GetOSEntities() с использованием DDS):

<DataTemplate x:Key="POSItemTemplate">
    <StackPanel>
        <toolkit:DataField Label="PackageOS.OS">
            <TextBlock Text="{Binding Source={StaticResource packageOSEntityDomainDataSource}, Path=Data.CurrentItem.OS}" />
        </toolkit:DataField>
        <toolkit:DataField Label="OS">
            <ComboBox ItemsSource="{Binding Path=Data, Source={StaticResource osEntityDomainDataSource}}"
                      SelectedItem="{Binding Path=Data.CurrentItem.OS, Source={StaticResource packageOSEntityDomainDataSource}}"/>
        </toolkit:DataField>
    </StackPanel>
</DataTemplate>

Основная проблема SelectedItem of ComboBox не работает.Все привязки доступны с помощью мастера привязки IDE, поэтому не проблема, что я наберу неправильный путь.Я вижу, что packageOSEntityDomainDataSource.Data.CurrentItem имеет тип PackageOS.

Если я создаю ручную запись в базе данных бэкэнда, результат отображается в PackageOS.OS текстовом блоке, поэтому я знаю, что он правильно возвращается, но SelectedItem отказывается забрать его (в конечном итоге он выбирает первое значение в раскрывающемся списке независимо от элемента OS в PackageOS).

Заранее большое спасибо!

1 Ответ

2 голосов
/ 21 февраля 2011

Наконец-то понял это.Оставив свой ответ в надежде, что это сэкономит кому-то еще время, которое я потратил на это.

Первый урок Проблема заключалась в том, что у меня не было пользовательской реализации Equality для сгенерированногосущности и равенство ссылок по умолчанию не работали, так как я использовал два разных экземпляра.Как только я реализовал IEquatable на своих сгенерированных сущностях (через частичные классы .shared.cs на стороне сервера), все стало работать как чудо.

Подробнее см. Управление заполнением Silverlight ComboBox от Manishdalal

Второй урок Не используйте несколько элементов управления DDS, если можете помочь.Особенно когда вы используете операцию записи в DDS, вы не можете загружать / обновлять любые другие DDS, которые совместно используют DomainContext, пока изменения не будут приняты.Приведенная выше ссылка показывает, как избежать нескольких DDS с помощью генераторов списков, когда все, что вам нужно, это выбрать список объектов, чтобы заполнить ComboBox.

Мой новый код выглядит следующим образом:

<DataTemplate x:Key="POSItemTemplate">
    <StackPanel d:DataContext="{Binding Source=packageOSDomainDataSource, Path=Data.CurrentItem}">
        <toolkit:DataField Label="OS">
            <ComboBox DisplayMemberPath="Name"
                      ItemsSource="{Binding Path=OSList, Source={StaticResource OSListGenerator}}"
                      SelectedItem="{Binding Path=OS, Mode=TwoWay}" />
        </toolkit:DataField>
    </StackPanel>
</DataTemplate>

Где OSListGenerator возвращает IEnumerable<OSEntity> через его свойство OSList после загрузки его из DomainContext

Третий урок В DataSemplate DDS вы должны быть явными с TwoWay Binding.Это новое поведение;На это у меня ушло несколько дней, так как большинство учебных пособий, на которые я ссылался, использовали SL3, и я не осознавал, что это было принципиальное изменение в поведении DDS DataTemplate в SL4.

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