Silverlight как использовать селектор шаблонов данных для элементов listbox при привязке к сложным коллекциям

#c# #silverlight

#c# #silverlight

Вопрос:

Я просматривал образцы DataTemplateSelectors для sivleright, и из примеров, которые я видел, значения, возвращаемые и оцениваемые в элементе управления содержимым, кажутся одним свойством, которое было возвращено в listbox из коллекции.

Есть ли у кого-нибудь какие-либо предложения о том, как это решается при возврате сложной коллекции в источник элемента listbox? Под сложной коллекцией я подразумеваю наблюдаемую коллекцию с именем «Результат», внутри которой существует коллекция списков под названием «Имена»? Мне нужно запустить селектор шаблонов данных из свойства, найденного в коллекции списков, а не свойств из коллекции результатов. т.е. Коллекция списков может содержать имя свойства, пол, возраст, и я хочу использовать свойство sex в качестве триггера, тогда как результат может содержать такие свойства, как property, time или notes, и мне не нужно использовать их для вызова триггера шаблона.

Спасибо за любые предложения.

Обновление с примером кода

Работа над этим, в которой я застрял, заключается в привязке пользовательского шаблона моего элемента listbox. Вот элемент управления listbox xaml

 <ListBox HorizontalAlignment="Stretch" ItemsSource="{Binding SearchResults[0].Results, Mode=TwoWay}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" BorderBrush="#66C4C4C4" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <qr:SearchResultItemControl />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
  

qr: SerarchResultItemContol xaml — это пользовательский элемент lsitbox, который я в настоящее время определил, этот пользовательский элемент управления содержит следующие элементы

 <Grid x:Name="LayoutRoot">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="92.915"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Rectangle Fill="#FFF4F4F5" Margin="5,6,7.5,0" RadiusY="4" RadiusX="4" Stroke="Black" Height="52" VerticalAlignment="Top"/>
    <TextBlock Margin="4,3,76,0" TextWrapping="Wrap" FontSize="13.333" Height="17" VerticalAlignment="Top" Grid.Column="1" d:LayoutOverrides="VerticalAlignment" FontWeight="Bold" Text="{Binding Type, Mode=TwoWay}"/>
    <TextBlock Margin="8,15,10.5,0" TextWrapping="Wrap" FontSize="9.333" Height="35" VerticalAlignment="Top" d:LayoutOverrides="VerticalAlignment" Text="image placeholder" TextAlignment="Center"/>
    <TextBlock Margin="3,97,4,0" TextWrapping="Wrap" FontSize="12" Height="17" VerticalAlignment="Top" Text="{Binding Relevance, Mode=TwoWay}"/>
    <TextBlock Margin="3,75,20,0" TextWrapping="Wrap" FontSize="12" Height="18" VerticalAlignment="Top" Width="70" Text="{StaticResource txtRelevance}"/>
    <TextBlock Grid.Column="1" Margin="4,24,5,6" TextWrapping="Wrap" FontSize="12" RenderTransformOrigin="0.5,0.5" Text="{Binding HitContext, Mode=TwoWay}"/>
</Grid>
  

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

ItemsSource возвращается из коллекции SearchResults моей модели просмотра, которая генерируется из службы WcF.

Код виртуальной машины для связываемой коллекции:

 public ObservableCollection<QueryResponse> SearchResults
    {
        get
        {
            return this._SearchResults;
        }
        private set
        {
            if (this._SearchResults == value)
                return;

            // Set the new value and notify
            this._SearchResults = value;
            this.NotifyPropertyChanged("SearchResults");//this binds to UI search returns
        }
    }
  

коллекция searchresult состоит из следующих свойств

Строка SearchResult строка QueryText Строка результатов QueryTime Итоговые совпадения…

Коллекция результатов, возвращаемая в SearchResult, содержит: string Content строка HitContext строка ID строка relevance тип строки

Чего я пытаюсь добиться, так это того, чтобы DataTemplateSelection запускался на основе значения типа, возвращаемого из коллекции результатов.

Любые предложения будут оценены.

Комментарии:

1. Опубликуйте код своих коллекций и классов. Класс DataTemplateSelecor может иметь код, подобный currentResultItem.Names.Any(n=>n.Name = "...") , поэтому я думаю, что будет нетрудно адаптировать его к вашему примеру.

Ответ №1:

Нашел свой ответ, основанный на следующем решении от codeproject Это решение предоставило очень простой шаблон выбора данных, который соответствует моим потребностям.

Что касается доступа к сложной коллекции по сравнению с плоской коллекцией, я сопоставил свой объект item с вложенной коллекцией и оттуда смог получить доступ к соответствующим свойствам.

Комментарии:

1. вы всегда можете поместить несколько сеток в одну DataTemplate и использовать видимость, чтобы скрыть / показать их соответствующим образом. Таким образом, вы избегаете использования этого TemplateSelector.