WPF GridViewRowPresenter将所有的内容转换为文本块

时间:2021-05-18 14:17:42

I'm trying to create a list with fully functional headers, but I can only seem to get either a list with functional headers and all list view items reduced to textblocks. OR a list view with all the buttons and text fully styled, but without the headers being properly linked. See the image below;

我正在尝试创建一个具有全功能标题的列表,但是我只能得到一个具有功能性标题的列表,所有列表视图项都被简化为textblock。或者是一个列表视图,其中所有的按钮和文本都是完全样式化的,但是没有正确地链接标题。见下图;

WPF GridViewRowPresenter将所有的内容转换为文本块

My ListView definition looks like this for both of them:

我的ListView定义是这样的:

              <ListView ItemsSource="{Binding ScenarioComponents}" Style="{StaticResource ListViewWithHeader}" ItemContainerStyle="{StaticResource ListViewWithHeaderItem}">
                    <ListView.View>
                        <GridView>
                            <GridViewColumn Width="Auto" Header="{Binding NameHeader}" DisplayMemberBinding="{Binding Name}"/>
                            <GridViewColumn Width="Auto" Header="{Binding TypeHeader}" DisplayMemberBinding="{Binding Type}"/>
                            <GridViewColumn Width="Auto" Header="{Binding InfoHeader}"/>
                            <GridViewColumn Width="Auto" Header="{Binding ExportHeader}"/>
                            <GridViewColumn Width="Auto" Header="{Binding DeleteHeader}"/>
                        </GridView>
                    </ListView.View>
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="5*"/>
                                    <ColumnDefinition Width="1.5*"/>
                                    <ColumnDefinition Width="0.5*"/>
                                    <ColumnDefinition Width="0.5*"/>
                                    <ColumnDefinition Width="0.5*"/>
                                </Grid.ColumnDefinitions>
                                <Label Grid.Column="0" Content="{Binding Name}" HorizontalAlignment="Left"/>
                                <Label Grid.Column="1" Content="{Binding Type}" Background="{StaticResource XVROrange}"/>
                                <Button Grid.Column="2" Style="{StaticResource BorderLessButton}" Command="{Binding MoreInfoCommand}">
                                    <Button.Content>
                                        <Image Source="/Views/Images/cc2_gui_information_default.png"/>
                                    </Button.Content>
                                </Button>
                                <Button Grid.Column="3" Style="{StaticResource BorderLessButton}" Command="{Binding ExportCommand}">
                                    <Button.Content>
                                        <Image Source="/Views/Images/cc2_gui_export_default.png"/>
                                    </Button.Content>
                                </Button>
                                <Button Grid.Column="4" Style="{StaticResource BorderLessButton}" Command="{Binding DeleteCommand}">
                                    <Button.Content>
                                        <Image Source="/Views/Images/cc2_gui_b_delete.png"/>
                                    </Button.Content>
                                </Button>
                            </Grid>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>

And the only difference in the styling is that the one with the Headers working uses a GridViewRowPresenter in the ListViewItem like this:

样式的唯一不同之处在于,具有页眉的那个在ListViewItem中使用了GridViewRowPresenter,如下所示:

        <Style x:Key="ListViewWithHeaderItem" TargetType="ListViewItem">
        <Setter Property="OverridesDefaultStyle" Value="true" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Border x:Name="Border" Padding="0" Background="Transparent" BorderBrush="{StaticResource XVR70}" BorderThickness="1">
                        <GridViewRowPresenter Content="{TemplateBinding Content}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

And the second one uses the same styling only with a ContentPresenter instead of the GridViewRowPresenter without any embellishments.

第二个版本只使用ContentPresenter,而不是GridViewRowPresenter,没有任何修饰。

         <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Border Background="Transparent" BorderBrush="{StaticResource Black47}" BorderThickness="0,0,0,0">
                        <ContentPresenter />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

For some reason using the GridViewRowPresenter means every item in my ListView.ItemTemplate's DataTemplate gets turned into a Textblock. And I can't figure out why. I'd really prefer to keep using the GridViewRowPresenter though as this means the headers are bound to the items in the list and scale with them and everything.

出于某种原因,使用GridViewRowPresenter意味着我列表视图中的每个条目。ItemTemplate的DataTemplate被转换为一个文本块。我不知道为什么。我真的更喜欢继续使用GridViewRowPresenter,因为这意味着标题被绑定到列表中的条目,并与它们和所有东西一起伸缩。

Has anyone got any idea how I can style this to work?

有谁知道我怎么把它设计成这样吗?

1 个解决方案

#1


0  

Can you put your templates from the ItemTemplate into the GridViewColumns?

你能把你的模板从ItemTemplate放到GridViewColumns中吗?

<ListView.View>
  <GridView>
    <GridView.Columns>
      <GridViewColumn Width="Auto" Header="{Binding NameHeader}" DisplayMemberBinding="{Binding Name}">
        <GridViewColumn.CellTemplate>
          <DataTemplate>
            <Label Grid.Column="0" Content="{Binding Name}" HorizontalAlignment="Left"/>
          </DataTemplate>
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
      <!-- more columns -->
    </GridView.Columns>
  </GridView>
</ListView.View>

#1


0  

Can you put your templates from the ItemTemplate into the GridViewColumns?

你能把你的模板从ItemTemplate放到GridViewColumns中吗?

<ListView.View>
  <GridView>
    <GridView.Columns>
      <GridViewColumn Width="Auto" Header="{Binding NameHeader}" DisplayMemberBinding="{Binding Name}">
        <GridViewColumn.CellTemplate>
          <DataTemplate>
            <Label Grid.Column="0" Content="{Binding Name}" HorizontalAlignment="Left"/>
          </DataTemplate>
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
      <!-- more columns -->
    </GridView.Columns>
  </GridView>
</ListView.View>