#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.