【问题标题】:DataGrid inside ListView as item templateListView 内的 DataGrid 作为项目模板
【发布时间】:2016-07-22 08:58:58
【问题描述】:

我在显示带有 DataGrids 的 ListView(作为项目模板)时遇到了一些问题。问题是 DataGrid 中的列宽大小不正确,并且没有拉伸以填充整个控件宽度。

代码:

<Window x:Class="WpfTest1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfTest1"
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>

        <x:Array x:Key="ListViewItems"
                 Type="{x:Type system:String}">
            <system:String>1</system:String>
            <system:String>2</system:String>
        </x:Array>

        <x:Array x:Key="DataGridItems"
                 Type="{x:Type system:String}">
            <system:String>1</system:String>
            <system:String>2</system:String>
            <system:String>3</system:String>
        </x:Array>

        <DataTemplate x:Key="TemplateWidthDataGrid">
            <DataGrid ItemsSource="{StaticResource DataGridItems}">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Column1"
                                        Width="*" />
                    <DataGridTextColumn Header="Column2"
                                        Width="*" />
                </DataGrid.Columns>
            </DataGrid>
        </DataTemplate>

    </Window.Resources>

    <Grid>
        <ListView ItemTemplate="{StaticResource TemplateWidthDataGrid}"
                  ItemsSource="{StaticResource ListViewItems}" />
    </Grid>
</Window>

结果如下所示:

在这种情况下如何让列填充控件宽度?

更新

按照 Ciccio 的回答,我在 ListViewItem 设置了 HorizontalContentAlignment 属性。

    <ListView ItemTemplate="{StaticResource TemplateWithDataGrid}"
              ItemsSource="{StaticResource ListViewItems}">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment"
                        Value="Stretch" />
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>

结果还是不满意:

(我还必须将AutoGenerateColumns="False" 设置为DataGrid。)

将此与放在ListView 之外的相同DataGrid 进行比较,如下所示:

<Grid>
    <DataGrid ItemsSource="{StaticResource DataGridItems}"
              AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Column1"
                                Width="*" />
            <DataGridTextColumn Header="Column2"
                                Width="*" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

【问题讨论】:

    标签: wpf listview datagrid


    【解决方案1】:

    问题在于 ItemPanel 没有拉伸其内容。您应该修复它,为 ListBoxItem 设置属性 HorizontalContentAlignment

    <Grid>
        <ListView ItemTemplate="{StaticResource TemplateWidthDataGrid}"
                  ItemsSource="{StaticResource ListViewItems}" >
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
    </Grid>
    

    编辑:

    根据我发现的Here,您可能会使用解决方法解决此问题:(将数据网格的 Width 绑定到 ActualWidth ListViewItemPresenter和调整Margin)

        <x:Array x:Key="ListViewItems" Type="{x:Type system:String}">
            <system:String>1</system:String>
            <system:String>2</system:String>
        </x:Array>
    
        <x:Array x:Key="DataGridItems" Type="{x:Type system:String}">
            <system:String>1</system:String>
            <system:String>2</system:String>
            <system:String>3</system:String>
        </x:Array>
    
        <DataTemplate x:Key="TemplateWidthDataGrid">
            <DataGrid AutoGenerateColumns="False" ItemsSource="{StaticResource DataGridItems}" Margin="-5,0,0,0"
                      Width="{Binding ActualWidth, Mode=OneWay, 
                      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsPresenter}}}"
                      HorizontalContentAlignment="Stretch" HorizontalAlignment="Stretch" >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Column1" Width="*" />
                    <DataGridTextColumn Header="Column2" Width="*" />
                </DataGrid.Columns>
            </DataGrid>
        </DataTemplate>
    
    </Window.Resources>
    
    <Grid>
        <ListView ItemTemplate="{StaticResource TemplateWidthDataGrid}" ItemsSource="{StaticResource ListViewItems}">
    
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
    </Grid>
    

    【讨论】:

    • 感谢您的回复! Horizo​​ntalContentAlignment 对 DataGrid 产生了一些影响,但列的宽度仍然错误。查看更新的问题。
    • 成功了,谢谢!另一个问题是当我调整窗口大小时水平滚动条出现和消失的故障。我认为必须有一种方法可以通过 Horizo​​ntalScrollBarVisibility 以某种方式禁用它
    猜你喜欢
    • 2017-04-24
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    相关资源
    最近更新 更多