WPF - GridView.GridViewColumn每行两行?

时间:2009-09-30 14:19:39

标签: c# wpf gridview listview mvvm

你好可以有一个ListView - > ListView.View - > GridView - > GridViewColumn每行“两行”。
例如。
第1栏|栏目2
行1 blah |数据呀
行2等|更

我尝试使用Cell模板失败,但是当手动调整其包含列的大小时,模板内的项目不会调整大小。

代码:

        <ListView Height="238" DockPanel.Dock="Top" ItemsSource="{Binding Blah}" 
              SelectedItem="{Binding Path=Selectedblah, UpdateSourceTrigger=PropertyChanged}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="No." DisplayMemberBinding="{Binding Path=Id}" Width="25" />
                <GridViewColumn Header="Job Type" DisplayMemberBinding="{Binding Path=Something}" Width="165" />
                <GridViewColumn Header="Assigned To" DisplayMemberBinding="{Binding Path=SomethingElse}" Width="90" />
                <GridViewColumn Header="Created" DisplayMemberBinding="{Binding Path=DateCreated, Converter={StaticResource dateTimeFormat}, ConverterParameter='dd/MM/yy HH:mm'}" Width="65" />
                <GridViewColumn>
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Image Source="/Streetcar.UI.Modules.FleetTracker;component/Resources/Images/tick.png" Visibility="{Binding IsCompleted, Converter={StaticResource boolToVis}}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

有什么想法吗?

编辑:这是使用MVVM所以只有一个有界的ViewModel背后没有代码

5 个答案:

答案 0 :(得分:4)

好的,我会再试一次。您是否尝试CellTemplate TextBlockTextWrapping设置为Wrap

例如:

<ListView x:Name="MyListView">
   <ListView.View>
      <GridView>
         <GridViewColumn Header="Hello"
                         Width="50">
            <GridViewColumn.CellTemplate>
               <DataTemplate>
                  <TextBlock Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce non nibh quis odio aliquet venenatis."
                             TextWrapping="Wrap"/>
               </DataTemplate>
            </GridViewColumn.CellTemplate>
         </GridViewColumn>
         <GridViewColumn Header="World"/>
      </GridView>
   </ListView.View>

   <ListViewItem/>
   <ListViewItem/>
   <ListViewItem/>
   <ListViewItem/>
</ListView>

答案 1 :(得分:3)

首先,CellTemplate是在单元格中拥有自定义内容的方法。例如,你可以在CellTemplate中有一个垂直的StackPanel。

接下来,要在更改列宽时自动调整单元格的内容,需要在ListViewItem上指定Horizo​​ntalContentAlignment =“Stretch”:

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    </Style>
</ListView.ItemContainerStyle>

答案 2 :(得分:1)

忍受我,因为我不是百分之百确定这是你所要求的。但是,假设您希望每行下面都有更多文本(outlook autopreview feature),我想我可以提供帮助。

您需要覆盖ListViewItem的默认样式,并更改ControlTemplate以在TextBlock下添加GridViewRowPresenter。当你完成后,它看起来像这样:

<Style TargetType="ListViewItem">
   <Setter Property="SnapsToDevicePixels" Value="true"/>
   <Setter Property="OverridesDefaultStyle" Value="true"/>
   <Setter Property="Template">
   <Setter.Value>
      <ControlTemplate TargetType="ListBoxItem">
         <Border Name="Border"
                 Padding="2"
                 SnapsToDevicePixels="true"
                 Background="Transparent">
            <StackPanel>
               <GridViewRowPresenter Columns="{TemplateBinding GridView.ColumnCollection}"  
                                     VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
               <TextBlock Text="This is where your text goes!"/>
            </StackPanel>
         </Border>

         <ControlTemplate.Triggers>
            <Trigger Property="IsSelected" Value="true">
               <Setter TargetName="Border"
                       Property="Background" Value="{StaticResource SelectedBackgroundBrush}"/>
            </Trigger>
            <Trigger Property="IsEnabled" Value="false">
               <Setter Property="Foreground" 
                       Value="{StaticResource DisabledForegroundBrush}"/>
            </Trigger>
         </ControlTemplate.Triggers>
         </ControlTemplate>
   </Setter.Value>
   </Setter>
</Style>

您可能必须对Width TextBlock的约ListView进行约束,以便将其包裹在{{1}}内,但这应该可以让您开始。

答案 3 :(得分:1)

这就是我所做的。

    

            <GridView ColumnHeaderToolTip="Addendum Master" >
                    <GridViewColumn Width="500">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>                                    
                                <StackPanel Orientation="Vertical" Margin="0">
                                    <Label Content="{Binding Path=Line1}" Padding="0" Margin="0" Style="{StaticResource GridLabelStyle}"></Label>
                                    <Label Content="{Binding Path=Line2}" Padding="0" Margin="0" Style="{StaticResource GridLabelStyle}"></Label>
                                    <Label Content="{Binding Path=Line3}" Padding="0" Margin="0" Style="{StaticResource GridLabelStyle}"></Label>
                                    <Label Content="{Binding Path=Line4}" Padding="0" Margin="0" Style="{StaticResource GridLabelStyle}"></Label>
                                </StackPanel>                                                                        
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>

答案 4 :(得分:0)

我觉得这是一个问题的简单解决方案,当涉及到每个记录2行时,许多人已经遇到这个问题,同时仍然能够使用gridview控件附带的分页和排序等。我会给你代码并试着尽我所能解释它。

    

    <Columns>                            
        <asp:BoundField DataField="CPTCode" HeaderText="CPTCode" ItemStyle-CssClass="center" SortExpression="CPTCode" >
            <ItemStyle CssClass="center" />
        </asp:BoundField>

            <asp:BoundField DataField="InsPlanCode" HeaderText="InsPlanCode" ItemStyle-CssClass="center" SortExpression="InsPlanCode" >
            <ItemStyle CssClass="center" />
        </asp:BoundField>

            <asp:BoundField DataField="StartDate" HeaderText="Start Date" ItemStyle-CssClass="center" SortExpression="StartDate" >
            <ItemStyle CssClass="center" />
        </asp:BoundField>

            <asp:BoundField DataField="EndDate" HeaderText="End Date" ItemStyle-CssClass="center" SortExpression="EndDate" >
            <ItemStyle CssClass="center" />
        </asp:BoundField>

        <asp:BoundField DataField="UserName" HeaderText="UserName" ItemStyle-CssClass="center" >
            <ItemStyle CssClass="center" />
        </asp:BoundField>   

        <asp:TemplateField HeaderText=" " ItemStyle-CssClass="center" HeaderStyle-BackColor="AliceBlue" ItemStyle-BackColor="AliceBlue">                                
            <ItemTemplate>        

                </td>
                </tr>
                <tr>
                    <td align="center" nowrap>&nbsp;<b>Message</b>&nbsp;</td>
                    <td colspan="10"><TABLE cellpadding=5><tr><td><%# Eval("carveOutMessage")%></td></tr></TABLE>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>

</asp:GridView>

诀窍在于自定义TemplateField ItemTemplate。

首先要知道的是,在创建TemplateField时在html源代码中呈现的内容是一个新的打开和关闭TD标记。在创建最后一列之后,它会关闭带有结束标记的行。 因此,创建模板字段打开和关闭以及打开和关闭ItemTemplate标记。在你的内心,你要做的第一件事就是关闭open td标签&#34;&#34;然后打开tr标签&#34;&#34;。然后创建一个新行和一个新列标记。现在,如果列需要为某种描述或注释列宽。使用columnspan = 10或者你需要多少。因为Templatefield将关闭TD标记,所以最后一个td标记不应该有一个结束标记,而你的最后一行不应该有一个结束TR标记,因为它将在结束标记的位置被关闭。

我希望这对人们有所帮助并且足够清楚。您可以使用此方法根据需要为每条记录创建任意数量的行。如果你对html和表格有任何好处,也可以做任何其他格式化的事情。关键是要记住,当你开始时,你在一个打开的td和tr标签内进行格式化,最后它将写入一个结束的td和tr标签,所以保持你的最后一列和行打开。

相关问题