我有一组要通过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/zh-cn/library/ms771309(VS.90).aspx
上面的Item4和Item7带有长文本,我想跨越其余的列(忽略原始列标题的含义)。 我怎样才能做到这一点?
我已经有一些带有DataTrigger的XAML设置,可以用自定义的TextBlock替换默认的GridViewRowPresenter,但这并不是我想要的。 我需要第1列中的数据能够正常显示,并识别第一列的宽度。
这是我最终通过适当的ListView解决此问题的方法:
关键是DataTriggered模板不使用GridViewRowPresenter,而是使用其自己的网格来伪造它的使用。为了与GridViewRowPresenter内部使用的内容相匹配,必须猜测一些填充/边距。另一个棘手的部分是将内部Grid列绑定到ListView列的整体宽度。调整列大小然后可以按预期工作。
当然,这将删除所有的悬停和选择效果,因为它将替换默认模板。 只需删除底部的设置模板即可。
@ user317033,它允许默认项的选择突出显示,但跨列的行仍不存在。
仅当第0列具有明确的宽度时,才尝试将长项与第1列对齐。 如果用户双击第一个分隔线以自动调整列的大小,则宽度将被视为零,并且文本将变得未对齐。 在示例中,可以通过将Columns[0].Width更改为Columns[0].ActualWidth来纠正此问题。
我有一个类似的问题,我希望某些行具有一个跨列的项目,该项目从第9列的第5列开始。我对@PeteVasi的答案实施了一种变体,其中有两个主要变化:
您想绑定到ActualWidth而不是Width,否则在例如列是自动调整大小的。
您可以使用RelativeSource避免通过名称指定myListView(这使其更适合在样式资源中使用)。
为此,请在此更改ColumnDefinition条目中的Width分配:
Width="{Binding ElementName=myListView, Path=View.Columns[0].Width}"
对此:
Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type ListView}}, Path=View.Columns[0].ActualWidth}"
此外,您不需要使用嵌套的,并且如果要保持鼠标悬停和选择突出显示效果,则需要克隆默认样式。
我对使用GridViewRowPresenter的答案进行了微小的变化实验,并玩了一个坏主意(监视列调整大小事件,并使用它们来设置绑定列宽的属性)。可以在github上的DisasmUiTest项目中找到各种实验,包括完全样式化的版本。
我认为,为此,您使用ListBox而不是ListView并使用其ItemTemplate拆分每列。
这样,您将有机会将Trigger放入其中或基于某些数据,使一个控件不可见并显示长文本。
:)
我还可以获得使用ListView的其他好处,例如全部对齐且可调整大小的列吗?
不,你不。 但是您需要自己实现相同的功能。 可能是您可以将每个TextBlock的大小与标头的大小绑定在一起,以便在调整标头的大小时,每个TextBox的大小都会改变。