<分区>
tl;dr:如果选择了 2 个项目,我希望详细 View 显示在 2 列中,如果只选择了 1 个项目,则希望详细 View 显示在 2 列中。
我有一个 DockPanel,左边有 2 个 ListBox,右边有一个 2 列的 Grid。
当在 listBox1 中选择一个项目时,我在网格的第 0 列中显示详细信息 View 。
当在 listBox2 中选择一个项目时,我会在网格的第 1 列中显示详细信息 View 。
<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>
这很好用。但是,我想对其进行修改,以便当在一个列表框中选择了一个项目但在另一个列表框中没有选择时,详细信息 View 将跨越两个网格列。
我的第一个想法是创建几个 DataTriggers,它们根据 ListBoxes 的 SelectedIndex 修改 ContentControls 的 ColumnSpan。
这对于通常位于 Grid.Column="0"中的详细信息 View 来说效果很好。但是,它不适用于通常位于 Grid.Column="1"中的详细信息 View ,因为原始列号是硬编码的:
<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>
如果我可以创建一个可以与 ListBox.SelectedIndex(即 >=0)进行值比较的 DataTrigger,那么我可以首先避免对列号进行硬编码。
有没有办法在 XAML 中做这样的事情?