tl; dr: Я хочу, чтобы подробные виды отображались в 2 столбцах, если выбраны 2 элемента, и в 2 столбцах, если выбран только 1 элемент.
У меня есть DockPanel с 2 ListBox, закрепленными слева, и 2-столбцовая Grid справа.
Когда элемент выбран в listBox1, я отображаю подробное представление в столбце 0 таблицы.
Когда элемент выбран в listBox2, я отображаю подробное представление в столбце 1 таблицы.
<DockPanel>
<StackPanel DockPanel.Dock="Left" Orientation="Horizontal">
<ListBox x:Name="listBox1" ItemsSource="{Binding Items1}" SelectedItem="{Binding SelectedItem1}"/>
<ListBox x:Name="listBox2" ItemsSource="{Binding Items2}" SelectedItem="{Binding SelectedItem2}"/>
</StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ContentControl Grid.Column="0" Content="{Binding SelectedItem1}" ContentTemplateSelector="{StaticResource SelectedItemTemplateSelector}"/>
<ContentControl Grid.Column="1" Content="{Binding SelectedItem2}" ContentTemplateSelector="{StaticResource SelectedItemTemplateSelector}"/>
</Grid>
</DockPanel>
Это отлично работает. Однако я хотел бы изменить его так, чтобы представление сведений охватывало оба столбца сетки , когда элемент выбран в одном из списков, но не в другом.
Моей первой мыслью было создание пары DataTriggers, которые изменяют ColumnSpan ContentControls на основе SelectedIndex ListBoxes.
Это прекрасно работает для представления сведений, которое обычно находится в Grid.Column = "0". Однако он не работает для подробного представления, которое обычно находится в Grid.Column = "1", поскольку исходный номер столбца жестко задан:
<ContentControl Grid.Column="0" Content="{Binding SelectedItem1}" ContentTemplateSelector="{StaticResource SelectedItemTemplateSelector}">
<ContentControl.Style>
<Style TargetType="ContentControl">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=listBox2, Path=SelectedIndex}" Value="-1">
<Setter Property="Grid.ColumnSpan" Value="2"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
<ContentControl Grid.Column="1" Content="{Binding SelectedItem2}" ContentTemplateSelector="{StaticResource SelectedItemTemplateSelector}">
<ContentControl.Style>
<Style TargetType="ContentControl">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=listBox1, Path=SelectedIndex}" Value="-1">
<!--Can't modify Grid.Column since it's hardcoded above!-->
<Setter Property="Grid.Column" Value="0"/>
<Setter Property="Grid.ColumnSpan" Value="2"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
Если бы я мог создать DataTrigger, который мог бы сравнивать значения со списком ListBox.SelectedIndex (т. Е.> = 0), тогда я мог бы избежать жесткого кодирования номеров столбцов.
Есть ли способ сделать что-то подобное в XAML?