wpf listview gridview交换项目模板

时间:2009-11-30 23:45:41

标签: wpf listview wpf-controls itemtemplate

我有一个使用gridview显示数据的列表视图。此列表显示网格视图的典型数据。行和列中显示的大量数据。但是,在某些行上,我没有要在列中显示任何数据。我想换掉该行的项目模板,并为整行显示另一个模板,该模板将显示文本的“空行”或“空行”,并且整个行的样式不是单个单元格。

我一直在尝试使用这篇文章:http://cloudstore.blogspot.com/2008/06/creating-custom-view-mode-that-supports.html

所以我有一个列表视图的自定义视图。基本上,我已经将GridView类子类化,并且在PrepareItems方法覆盖上,我可以选择要为特定行或默认模板显示的新模板。但是,当我尝试选择新模板时,gridview将永远不会为该行渲染任何内容。如果我使用默认模板,它仍将呈现。我假设GridView的布局干扰了我想要换出的行的模板设置。这是可能的还是我必须创建一个模仿GridView的自定义视图而不是GridView类的子类?我想保持列的方式没有太多的返工。任何建议或任何人都有这种情况的经验?

2 个答案:

答案 0 :(得分:1)

您可以使用DataTriggers。使用这样的代码(切换模板取决于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>

希望它有所帮助。

答案 1 :(得分:1)

好的,这就是我为解决我的问题所做的工作,但是这将导致我的一些返工。我使用项目控件替换了我的listview。所以我不再使用列表视图的GridView了。相反,我定义了一个GridViewColumnCollection,我的列设置了我想要的方式。

对于我的标题,我使用了GridViewHeaderRowPresenter,其columns属性绑定到GridViewColumnCollection。这会处理列标题。

在我的标题下面,我插入了绑定到我的项目列表的ItemsControl。但是,我现在使用DataTemplateSelector,它将根据项目及其属性交换模板。如果您不熟悉DataTemplate选择器,请转到此处:data template selector

基本上,我列表中项目的默认模板是GridViewRowPresenter,其columns属性绑定到GridViewColumnCollection。这使它与标题保持一致。但是,我仍然可以通过数据模板选择器将行的模板换成其他内容。这解决了我的问题。

但是,我现在必须使用我设计过的gridview重新编写listview,并使用此方法。所以这不是没有一些成本的。