В настоящее время я реализую список в WPF, который будет иметь 2 альтернативных макета для своих элементов:
До сих пор я делал это, используя DataTrigger
переключить ItemTemplate
для ListBox
, и он работает хорошо:
<ListBox ItemsSource="{Binding Runs}" SelectedItem="{Binding SelectedRun}">
<ListBox.Style>
<Style TargetType="ListBox">
<Setter Property="ItemTemplate" Value="{StaticResource tileTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ShowRunsAsIcons}" Value="True">
<Setter Property="ItemTemplate" Value="{StaticResource iconTemplate}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.Style>
</ListBox>
Однако коллекция Runs
, к которой привязан список, также будет содержать различные типы изobject:
interface IRunItem
{
// ...
}
class CompletedRunItem : IRunItem
{
// ...
}
class PendingRunItem : IRunItem
{
// ...
}
Каждый из типов объектов должен иметь свои собственные шаблоны 'tile' и 'icon' (всего 4 шаблона).Как лучше всего включить эти два свойства в соответствии с логическим значением ShowRunsAsIcons
и типом элемента списка?
Я рассмотрел возможность использования пары подклассов DataTemplateSelector
- один из которых можно выбирать междушаблоны листов, основанные на типе элемента, и один на выбор между шаблонами значков, основанными на типе элемента, - но это кажется ужасно неуклюжим.Мне кажется, что я должен воспользоваться возможностью WPF выбирать правильный шаблон в зависимости от типа объекта, но в этом случае я не вижу, как совместить это с различными параметрами представления списка.
Любые идеи о том, как сделать это, больше в духе WPF?
Спасибо.