Silverlight переплет коллекции с коллекцией внутри - PullRequest
1 голос
/ 08 марта 2011

У меня есть наблюдаемая коллекция команд, которые затем связаны с RadGridview.Здесь нет проблем.Я могу заполнить свою сетку названием команды в первом столбце.Во второй колонке будет указан главный тренер.В моей коллекции команд есть еще одна коллекция KeyPeople, которая содержит главного тренера.так что я изо всех сил пытаюсь выяснить, как связать этот второй столбец с другой коллекцией.

У меня есть это в моей модели представления

TeamResults = new ObservableCollection<Teams>(_context.Teams);

KeyPeopleResults = new ObservableCollection<KeyPerson>(TeamResults.Select(x => x.KeyPerson).Where(g => g.RelationshipType == "Coach"));

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

Ответы [ 3 ]

2 голосов
/ 08 марта 2011

Вы можете сделать свойство на стороне клиента для своего класса Team.

Все привязки для элементов управления, основанные на ItemsControl, привязываются непосредственно к отдельным объектам, отображаемым в списке, а НЕ к самому списку. То же самое относится и к вашей виртуальной машине: простое изменение ViewModel вам тоже не поможет. Вам нужно изменить сам объект, чтобы он содержал достаточно информации для объектов привязки, которые вы создаете в xaml.

Поскольку вы используете службы WCF RIA, вы можете создавать свойства на стороне клиента, которые действительно работают для вас. Надеюсь, вы абстрагируете свои службы RIA в библиотеки на стороне сервера и библиотеки на стороне клиента.

Просто сделайте часть своего класса Team в библиотеке на стороне клиента, где живет DataContext, и напишите код, подобный следующему:

public partial Team
{
    public KeyPerson HeadCoach
    {
        get
        {
            if (this.PeopleInTeam != null && this.PeopleInTeam.Any())
            { 
                return this.PeopleInTeam.FirstOrDefault(g => g.RelationshipType == "Coach"));    
            }

            return null;
        }
    }
}

Тогда в вашей привязке вы можете просто привязать свойства в Team:

<data:DataGridTextColumn Binding="{Binding Name}" /> /*Team is implied as the object in each row is a Team*/
<data:DataGridTextColumn Binding="{Binding HeadCoach.Name}" />
<data:DataGridTextColumn Binding="{Binding HeadCoach.PhoneNumber}" />  

Это ОЧЕНЬ распространенная техника. Это также причина того, что у нас есть доступ для написания кода на стороне клиента для классов, генерируемых службами RIA WCF.

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

Если это не представляется возможным решением, сделайте HeadCoach свойством {get;set;} в своем коде ClientSide. Кроме того, так как WCF RIA является навигационной системой, если вы сделаете отдельный запрос в том же самом DataContext в качестве первого запроса, навигационная система ключевых людей уже будет настроена, таким образом, свойство вашего частичного класса будет автоматически работать.

Веселись!

1 голос
/ 08 марта 2011

Похоже, вам нужно добавить свойство HeadCoach в вашу ViewModel. Иметь индекс этого свойства HeadCoach в списке.

Если это невозможно, попробуйте использовать конвертер значений в привязке. Как-то так, прошу прощения за код psuedo.
<Column Text="{Binding Path=KeyPeople, Converter={StaticResource FindHeadCoachConverter}"/>

0 голосов
/ 08 марта 2011

Почему бы вам не использовать такую ​​структуру данных, как ObservableCollection<KeyValuePair<string, string>>? Было бы намного легче связать.

key может быть названием команды, а value может быть именем тренера.

...