C# 触发器上的WPF Change Grid.ColumnSpan
tl;dr:如果选择了2个项目,我希望详细视图显示在2列中,如果只选择了1个项目,则希望详细视图显示在2列中 我有一个DockPanel,左侧有两个列表框,右侧有两列网格 当在listBox1中选择一个项目时,我会在网格的第0列中显示一个详细信息视图C# 触发器上的WPF Change Grid.ColumnSpan,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,tl;dr:如果选择了2个项目,我希望详细视图显示在2列中,如果只选择了1个项目,则希望详细视图显示在2列中 我有一个DockPanel,左侧有两个列表框,右侧有两列网格 当在listBox1中选择一个项目时,我会在网格的第0列中显示一个详细信息视图 <DockPanel> <StackPanel DockPanel.Dock="Left" Orientation="Horizontal"> <ListBox x:N
<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>
当在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>
这个很好用。但是,我想对其进行修改,以便当在其中一个列表框中选择了一个项目而在另一个列表框中没有选择时,详细信息视图将跨越两个网格列
我的第一个想法是创建两个DataTrigger,根据列表框的SelectedIndex修改ContentControls的ColumnSpan
对于通常位于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中有什么方法可以做这样的事情吗 您始终可以使用隐藏元素绑定技巧。在下面的示例中,只需将bindme更改为2,轴网跨度就会更改。我在所有类型的东西上都这样做,你不能用故事板来制作动画
您始终可以使用隐藏元素绑定技巧。在下面的示例中,只需将bindme更改为2,轴网跨度就会更改。我在所有类型的东西上都这样做,你不能用故事板来制作动画