【问题标题】:ListView's ItemContainerStyle blocks Column Item Binding on GridView [duplicate]ListView的ItemContainerStyle阻止GridView上的列项绑定[重复]
【发布时间】:2020-01-28 22:34:13
【问题描述】:

为什么ItemContainerStyle 的实现(详述如下)会导致单个数据列绑定在其他工作正常的ListView/GridView 上失败?

这是失败的视觉结果,其中显示了 3 行中的总项目,但不显示单个列项目:

没有覆盖ItemContainerStyle的实现:


实际目标 在回答问题之前,请考虑一下我的最终目标是替代解决方法。我想要一个类似GridView 的结构,其中每个 row 都有一个 阴影;最好显示在所选项目上/悬停操作上以使行弹出。 正如上面的失败示例所示


代码

<ListView ItemsSource="{StaticResource People}">

                            <!--Comment this out to see working display-->
<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListViewItem">
                    <Grid Background="White" Margin="20">
                        <Grid.Effect>
                            <DropShadowEffect />
                        </Grid.Effect>
                        <ContentPresenter Content="{TemplateBinding Content}" 
                                          ContentTemplate="{TemplateBinding ContentTemplate}"
                                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                    </Grid>
                </ControlTemplate>
        </Setter.Value>
        </Setter>
    </Style>
</ListView.ItemContainerStyle>
                                <!--End Failure Point-->
<ListView.View>
    <GridView >
        <GridViewColumn Header="First" DisplayMemberBinding="{Binding Path=First}"  />
        <GridViewColumn Header="Last"  DisplayMemberBinding="{Binding Path=Last}" />
        <GridViewColumn Header="Phone" DisplayMemberBinding="{Binding Path=Phone}" />
    </GridView>
</ListView.View>
</ListView>

要复制你需要

Xaml 中定义的静态资源数据

xmlns:model="clr-namespace:{your namespace}.Model"

<UserControl.Resources>
    <model:People x:Key="People">
        <model:Person First="Joe" Last="Smith" Phone="303-555-5555"/>
        <model:Person First="Jenny" Last="Johnson" Phone="720-867-5309" />
        <model:Person First="Frank" Last="Wright" Phone="202-555-5555" />
    </model:People>
</UserControl.Resources>

People.cs 在模型命名空间中

public class People : List<Person> { }

public class Person
{
    public string First { get; set; }
    public string Last { get; set; }
    public string Phone { get; set; }
}

【问题讨论】:

    标签: wpf listview gridview itemcontainerstyle


    【解决方案1】:

    ContentPresenter 是用于ItemContainerStyleControlTemplate 的错误节点类型。

    要修复将 ContentPresenter 更改为 GridViewRowPresenter 并同时删除 ContentTemplate 的问题:

    <ControlTemplate TargetType="ListViewItem">
        <Grid Background="White" Margin="20">
            <Grid.Effect>
                <DropShadowEffect />
            </Grid.Effect>
            <GridViewRowPresenter Content="{TemplateBinding Content}"                                  
                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
        </Grid>
    </ControlTemplate>
    

    视觉效果

    【讨论】:

      猜你喜欢
      • 2018-11-08
      • 2020-01-05
      • 2012-06-10
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多