2009-12-04 53 views
1

tl; dr:如果选择2个项目,我希望详细视图显示在2列中,如果只选择1个项目,则显示2列。WPF Change Grid.ColumnSpan on trigger

我有一个DockPanel,它有两个停靠在左边的ListBoxes和一个右边的两列Grid。

当在listBox1中选择一个项目时,我会在网格的第0列中显示详细信息视图。

当在列表框2中选择一个项目时,我会在网格的第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,它根据ListBoxes的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中做这样的事情?

回答

0

你总是可以做隐藏的元素绑定技巧。下面的例子中,您只需将bindme更改为2,并且网格跨度将会改变。我对所有类型的东西都做了这样的事情,你不能用故事板制作动画。

<矩形X:名称= “bindme” WIDTH = “0” HEIGHT = “0” 标记= “1”/>

<网格Grid.ColumnSpan = “{绑定标记,的ElementName = bindme}” >

相关问题