2010-10-19 71 views
3

我有一組數據,我想通過一個WPF的ListView呈現這樣:WPF - 如何讓某些ListView項目跨越列?

 
Column1 Column2 Column3 
--GroupName1-- 
Item1  part2  part3 
Item2  part2  part3 
--GroupName2-- 
Item3  part2  part3 
Item4  long_text_in_both_columns 
Item5  part2  part3 
--GroupName1-- 
Item6  part2  part3 
Item7  long_text_in_both_columns 
--GroupName3-- 
Item8  part2  part3 

我用這個基本的樣本工作開始:以上http://msdn.microsoft.com/en-us/library/ms771309(VS.90).aspx

項目4和Item7有長的文本,我想跨越其餘的列(忽略原來的列標題是什麼)。我怎樣才能做到這一點?

我已經有了一個DataTrigger的XAML設置來替換默認的GridViewRowPresenter自定義的TextBlock,但這不是我正在尋找的。我需要正常顯示第1列中的數據,並識別第一列的寬度。

回答

5

以下是我結束了一個合適的ListView解決這個:

 <ListView.ItemContainerStyle > 
      <Style TargetType="ListViewItem"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ShowAcrossColumns}" Value="True"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type ListViewItem}"> 
            <Grid> 
             <Grid> 
              <Grid.ColumnDefinitions> 
               <ColumnDefinition Width="{Binding ElementName=myListView, Path=View.Columns[0].Width}" /> 
               <ColumnDefinition Width="*" /> 
              </Grid.ColumnDefinitions> 
              <TextBlock Grid.Column="0" Padding="6,3,6,3" Text="{Binding Column1Text}" /> 
              <TextBlock Grid.Column="1" Padding="6,3,6,3" Text="{Binding ColumnSpanningText}" /> 
             </Grid> 
            </Grid> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
       </Style.Triggers> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type ListViewItem}"> 
          <Grid> 
           <GridViewRowPresenter /> 
          </Grid> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ListView.ItemContainerStyle> 

的關鍵是DataTriggered模板不使用GridViewRowPresenter,而是假貨與使用它的自己的電網。一些填充/邊界必須被猜到,以匹配GridViewRowPresenter在內部使用的內容。另一個棘手的部分是將內部Grid列綁定到整個ListView列的寬度。調整列大小然後按預期工作。

+0

這當然會刪除所有懸停和選擇效果,因爲它會替換默認模板。只需刪除底部的Setter模板。 – Mark 2013-04-20 16:50:59

0

我想爲此,您使用ListBox而不是ListView並使用它的ItemTemplate來拆分每個列。

<ListBox> 
<ListBox.ItemTemplate> 
<DataTemplate> 
    <StackPanel> 
    <TextBlock Text="{Binding Text1}"/> 
    <TextBlock Text="{Binding Text2}" /> 
    </StackPanel> 
</DataTemplate> 
</ListBox.ItemTemplate> 
</ListBox> 

這樣你將有機會把觸發器或基於一些數據,你可以做一個控制隱形並顯示長文本。

:)

+0

我仍然可以獲得使用ListView的其他好處,例如所有列和可調整大小的列? – PeteVasi 2010-10-19 21:05:41

+0

不,你沒有。但是你需要自己實現。也許你可以將每個TextBlock的大小與頭部的大小綁定,這樣當頭部被調整大小時,每個TextBox的大小都會改變。 – abhishek 2010-10-20 07:40:16