2009-12-04 77 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}」 >