Как добавить строку заголовка в WPF в ListView Grid с ColumnDefintions? - PullRequest
0 голосов
/ 17 января 2019

Я использую ViewModel для привязки данных к представлению в каждом текстовом блоке. Я сократил код до самых важных частей.

Теперь я хочу добавить строку заголовка в эту структуру. Поэтому каждый столбец, определенный ниже в Grid.RowDefinitions, должен иметь постоянный текст заголовка. Любая идея, как я могу это реализовать?

    <Grid>
    <ListView DockPanel.Dock="Top" Margin="10" ItemsSource="{Binding CurrentView}">
        <ListView.ItemTemplate>
            <DataTemplate DataType="viewModel:ViewModel">
                <Border BorderBrush="Black" BorderThickness="1" Margin="1">
                    <Expander ToolTip="Expand" ExpandDirection="Down" Foreground="Black">
                        <Expander.Header>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="Auto" />
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="*" />
                                </Grid.RowDefinitions>

                                <TextBlock Grid.Column="0" Width="20" Text="{Binding Model.Number, StringFormat='#{0}', Mode=OneWay}" TextAlignment="Left" Margin="5" />
                                <Image Grid.Column="1" />
                                <TextBlock Grid.Column="2" TextAlignment="Center" Margin="5" Width="50">
                                    <Hyperlink />
                                </TextBlock>
                                <TextBlock Grid.Column="3" TextAlignment="Left" Margin="5" TextWrapping="Wrap" />
                                <TextBlock Grid.Column="4" TextAlignment="Center" Margin="5" Width="100" />
                                <Button Grid.Column="5" />
                            </Grid>
                        </Expander.Header>
                        <GroupBox Header="Description" FontWeight="Bold">
 <TextBlock Text="{Binding Model.Description, Mode=OneWay}" TextWrapping="Wrap" FontWeight="Normal" TextAlignment="Left" Margin="5" />
                        </GroupBox>
                    </Expander>
                </Border>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

Хорошо, вы, ребята, очень помогли :) Я изменил структуру на приведенный ниже код, и заголовки работают нормально!

Но в моем исходном коде есть этот расширитель. Везде в строке, я мог бы нажать, чтобы развернуть описание. Расширитель теперь не будет работать с новым дизайном. Есть идеи? В основном я хочу что-то вроде этого:

<ListView Name="test2" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Items}">
        <ListView.View>
            <GridView>
              <Expander>
              <Expander ToolTip="Expand" ExpandDirection="Down" Foreground="Black">
                <Expander.Header>
                <GridView.Columns>
                    <GridViewColumn Header="Column1">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Title}"> </TextBlock>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Column2">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Test}"></TextBlock>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView.Columns>
                </Expander.Header>
                <TextBlock Text="Here goes the Description" />
                <Expander>
            </GridView>
        </ListView.View>
    </ListView>

Как это должно выглядеть (пожалуйста, не обращайте внимания на мои навыки рисования)

1 Ответ

0 голосов
/ 17 января 2019

Это даст каждому столбцу заголовок, но я не уверен, что именно таковы ваши намерения:

<ListView x:Name="test" DockPanel.Dock="Top" Margin="10" ItemsSource="{Binding CurrentView}">
            <ListView.ItemTemplate>
                <DataTemplate DataType="viewModel:ViewModel">
                    <Border BorderBrush="Black" BorderThickness="1" Margin="1">
                        <Expander ToolTip="Expand" ExpandDirection="Down" Foreground="Black">
                            <Expander.Header>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto" />
                                        <ColumnDefinition Width="Auto" />
                                        <ColumnDefinition Width="Auto" />
                                        <ColumnDefinition Width="*" />
                                        <ColumnDefinition Width="Auto" />
                                        <ColumnDefinition Width="Auto" />
                                    </Grid.ColumnDefinitions>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*" />
                                    </Grid.RowDefinitions>
                                    <Label Grid.Column="0">Column 1</Label>
                                    <Label Grid.Column="1">Column 2</Label>
                                    <Label Grid.Column="2">Column 3</Label>
                                    <Label Grid.Column="3">Column 4</Label>

                                    <TextBlock Grid.Column="0" Width="20" Text="{Binding Model.Number, StringFormat='#{0}', Mode=OneWay}" TextAlignment="Left" Margin="5" />
                                    <Image Grid.Column="1" />
                                    <TextBlock Grid.Column="2" TextAlignment="Center" Margin="5" Width="50">
                            <Hyperlink />
                                    </TextBlock>
                                    <TextBlock Grid.Column="3" TextAlignment="Left" Margin="5" TextWrapping="Wrap" />
                                    <TextBlock Grid.Column="4" TextAlignment="Center" Margin="5" Width="100" />
                                    <Button Grid.Column="5" />
                                </Grid>
                            </Expander.Header>
                        </Expander>
                    </Border>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

лучшая структура должна выглядеть примерно так (например, вы должны изменить ее, чтобы удовлетворить свои собственные потребности)):

 <ListView Name="test2" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Items}">
            <ListView.View>
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn Header="Column1">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Title}"></TextBlock>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Header="Column2">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Test}"></TextBlock>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>

Я думаю, что теперь я понимаю, что вы пытаетесь достичь

Я протестировал это решение, и оно отлично работает, попробуйте это с вашими собственными данными:

<CollectionViewSource x:Key='key' Source="{Binding Source={StaticResource MyData}}">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="@Catalog" />
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
</Window.Resources>

<ListView ItemsSource='{Binding Source={StaticResource key}}' BorderThickness="0,0,0,0">
    <ListView.GroupStyle>
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="{x:Type GroupItem}">
                    <Setter Property="Margin" Value="0,0,0,5"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type GroupItem}">
                                <Expander IsExpanded="True"
                                          BorderBrush="Gray"
                                          BorderThickness="0,0,0,1">
                                    <Expander.Header>
                                        <DockPanel>
                                            <TextBlock  Text="{Binding Path=Name}" Margin="5,0,0,0" Width="100"/>
                                            <TextBlock  Text="{Binding Path=Item}"/>
                                        </DockPanel>
                                    </Expander.Header>
                                    <Expander.Content>
                                        <ItemsPresenter />
                                    </Expander.Content>
                                </Expander>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </ListView.GroupStyle>

    <ListView.View>
        <GridView>
            <GridViewColumn Header="ID"
                    DisplayMemberBinding="{Binding ID}"
                    Width="100" />
            <GridViewColumn Header="Titel"
                    DisplayMemberBinding="{Binding This}"
                    Width="100" />
            <GridViewColumn Header="Date"
                    DisplayMemberBinding="{Binding Should}"
                    Width="100" />
            <GridViewColumn Header="Something"
                    DisplayMemberBinding="{Binding Work}"
                    Width="100" />
        </GridView>
    </ListView.View>
</ListView>

Как это выглядит:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...