5

我有一组数据,我想通过 WPF ListView 以这种方式呈现:

列 1 列 2 列 3
--组名1--
第 1 部分第 2 部分第 3 部分
第 2 部分第 2 部分第 3 部分
--组名2--
第 3 部分第 2 部分第 3 部分
第 4 项 long_text_in_both_columns
第 5 部分第 2 部分第 3 部分
--组名1--
第 6 部分第 2 部分第 3 部分
Item7 long_text_in_both_columns
--组名3--
第 8 部分第 2 部分第 3 部分

我开始使用这个基本示例: http: //msdn.microsoft.com/en-us/library/ms771309 (VS.90).aspx

上面的 Item4 和 Item7 有很长的文本,我想跨越剩余的列(忽略原始列标题的用途)。我怎样才能做到这一点?

我已经有一些带有 DataTrigger 的 XAML 设置,可以用自定义的 TextBlock 替换默认的 GridViewRowPresenter,但这并不是我想要的。我需要正常显示第 1 列中的数据并识别第一列的宽度。

4

3 回答 3

7

以下是我最终使用适当的 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 列宽。调整列大小然后按预期工作。

于 2010-12-17T15:37:55.043 回答
0

我认为为此,您使用 ListBox 而不是 ListView 并使用它的 ItemTemplate 来拆分每一列。

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

通过这种方式,您将有机会将触发器放入或基于某些数据,您可以使一个控件不可见并显示长文本。

:)

于 2010-10-19T20:24:38.210 回答
0

我有一个类似的问题,我希望某些行有一个从第 5 列(共 9 列)开始的多列跨越项。我对@PeteVasi 的回答做了一个变体,主要有两个变化:

  • 您想绑定到ActualWidth而不是Width,或者当列自动调整大小时它不能正常工作。
  • 您可以使用RelativeSource避免myListView按名称指定(这使其更适合在样式资源中使用)。

为此,请从以下更改条目Width中的分配:ColumnDefinition

Width="{Binding ElementName=myListView, Path=View.Columns[0].Width}"

对此:

Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
    AncestorType={x:Type ListView}}, Path=View.Columns[0].ActualWidth}"

此外,您不需要使用 nested <Grid>,如果要保留鼠标悬停和选择突出显示效果,则需要克隆默认样式。

我对使用的答案进行了微小的实验,并尝试了GridViewRowPresenter一个坏主意(观察列调整大小事件并使用它们来设置绑定列宽的属性)。各种实验,包括完整样式的版本,可以在 github 上的 DisasmUiTest 项目中找到。

于 2019-05-23T00:13:23.950 回答