【问题标题】:wpf listview gridview swaping item templatewpf listview gridview交换项目模板
【发布时间】:2010-12-21 20:19:08
【问题描述】:
我有一个使用gridview 显示数据的列表视图。此列表显示网格视图的典型数据。大量数据显示在行和列中。但是,在某些行上,我没有任何数据要显示在列中。我想换出该行的项目模板并为整行显示另一个模板,该模板将为文本显示“空白行”或“空行”之类的内容,并且还设置整行而不是单个单元格的样式。
我一直在尝试使用这个帖子:http://cloudstore.blogspot.com/2008/06/creating-custom-view-mode-that-supports.html。
所以我有一个列表视图的自定义视图。基本上,我对 GridView 类进行了子类化,并且在 PrepareItems 方法覆盖上,我可以选择要为特定行显示的新模板或默认模板。但是,当我尝试选择新模板时,gridview 将永远不会为该行呈现任何内容。如果我使用默认模板,它仍然会呈现。我假设 GridView 的布局干扰了我对要换出的行的模板设置。这是可能的还是我必须创建一个模仿 GridView 而不是 GridView 类的子类的自定义视图?我想保持这些列的原样,而不需要太多的返工。有什么建议或任何人对这种情况有经验吗?
【问题讨论】:
标签:
wpf
listview
wpf-controls
itemtemplate
【解决方案1】:
您可以使用数据触发器。使用这样的代码(根据 SomeItemProperty 的值是否为 0 来切换模板):
<DataTemplate x:Key="MyItemTemplate">
<StackPanel>
<StackPanel Name="normalStackPanel">
<!-- template for normal row -->
</StackPanel>
<StackPanel Name="emptyStackPanel" Visibility="Collapsed">
<!-- template for empty row -->
</StackPanel>
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding SomeItemProperty}" Value="0">
<Setter TargetName="normalStackPanel" Property="Visibility" Value="Collapsed" />
<Setter TargetName="emptyStackPanel" Property="Visibility" Value="Visible" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
希望对你有帮助。
【解决方案2】:
好的,这就是我为解决我的问题所做的,但是它会导致我的一些返工。我用项目控件替换了我的列表视图。所以我不再使用列表视图的 GridView 了。相反,我定义了一个 GridViewColumnCollection,并按照我想要的方式设置了我的列。
对于我的标题,我使用了 GridViewHeaderRowPresenter,它的 columns 属性绑定到 GridViewColumnCollection。这会处理列标题。
在我的标题下,我插入了绑定到我的项目列表的 ItemsControl。但是,我现在使用 DataTemplateSelector,它将根据项目及其属性交换模板。如果您不熟悉 DataTemplate 选择器,请转到此处:data template selector
基本上,列表中项目的默认模板是 GridViewRowPresenter,其列属性绑定到 GridViewColumnCollection。这使它与标题保持一致。但是,我仍然可以通过数据模板选择器将模板换成一行。这解决了我的问题。
但是,我现在必须使用我已设置样式的网格视图重新处理列表视图,并使用此方法。因此,这并非没有代价。