Я пытаюсь отключить ContentPresenter объекта ListBoxItem, когда он выбран, при использовании нескольких шаблонов данных для представления различных типов данных.
Вот UserControl, который определяет ListBox внутри:
<UserControl x:Class="Homage.View.FilePanelView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vw="clr-namespace:Homage.View"
xmlns:vm="clr-namespace:Homage.ViewModel"
xmlns:ctrl="clr-namespace:Homage.Controls"
mc:Ignorable="d">
<UserControl.Resources>
<DataTemplate DataType="{x:Type vm:SlugViewModel}">
<vw:SlugView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}">
<vw:HeaderSlugView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:ContentSlugViewModel}">
<vw:ContentSlugView />
</DataTemplate>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border Name="SlugContainer" Background="Transparent" BorderBrush="Black" BorderThickness="1" CornerRadius="2" Margin="0,5,0,0" Padding="5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Content="{Binding DisplayName}" />
<ContentPresenter Grid.Row="1" />
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="SlugContainer" Property="BorderThickness" Value="5" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Grid>
<ListBox ItemsSource="{Binding Slugs}" Padding="5" />
</Grid>
</UserControl>
В зависимости от типа отображаемых данных (например, «Заголовок заголовка») определенный шаблон данных применяется к ListBoxItem. Это прекрасно работает, но я хочу настроить DataTemplate выбранного ListBoxItem на другой DataTemplate - опять же, в зависимости от отображаемого типа данных.
Цель состоит в том, что, поскольку каждый тип данных отличается, каждый будет иметь уникальный внешний вид, когда он не выбран, и получит уникальный набор параметров при выборе.
Если бы я мог заставить работать вышеперечисленное, это было бы здорово! Но я тоже хочу все усложнить ...
Хотя каждый тип данных имеет уникальные элементы управления, они также имеют общие элементы управления. Поэтому в идеале я хотел бы определить все общие элементы управления один раз, чтобы они отображались в одном и том же месте в ListBox.
<DataTemplate x:Key="CommonSelectedTemplate">
<!-- common controls -->
...
<DataTemplate x:Key="UniqueSelectedTemplate">
<!-- all the unique controls -->
<ContentPresenter />
</DataTemplate>
<!-- more common controls -->
...
</DataTemplate>
Если мне придется определять все общие вещи несколько раз (пока), я буду жить. =)
Спасибо за любую помощь!