在没有GridColumnHeader的情况下在ListView上配置标头

时间:2016-01-29 18:42:43

标签: c# wpf xaml listview

我想弄清楚如何在XAML中创建一个ListView,其标题均匀分布,不用使用GridViewColumn。我不想使用GridViewColumn的原因是因为标题只会延伸到内容的总宽度,并且尝试将它们拉伸到其容器的整个可用宽度是不是听起来很简单(至少我没有找到一个干净的方法)。

到目前为止,我已经在XAML中提出了类似的东西(为简洁起见用伪代码编写):

<Grid>
     <Grid.RowDefinitions>
          <RowDefintion/>
          <RowDefintion/>
     </Grid.RowDefinitions>
     <Grid x:Name="HeaderGrid">...</Grid>
     <ListView>
</Grid>

第一个嵌套网格HeaderGrid将包含我的所有标题,ListView将保存列表中的每个元素。我的问题是如何将HeaderGrid的列与ListView的列对齐,而不使用SharedSpaceScope之类的内容。这样做的原因是SharedSpaceScope不允许您使用星号大小,因此我们最后回到我们开始的位置,其中列标题只是缩小以适应内容而不是占用所有可用空间。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

由于您实际的问题是如何在ListView中定义比例列,我将对此进行补充。

自己定义ListView列而不是使用GridView列会将您重定向到您最初遇到的同一问题,所以我建议您坚持使用GridView

假设您有以下型号:

 public class Sample
{
    public string Name { set; get; }
    public string Location { set; get; }
}

  private ObservableCollection<Sample> _items=new ObservableCollection<Sample>()
    {
        new Sample()
        {
            Location = "Loc1",
            Name = "Nam1"
        }
    }; 

    public ObservableCollection<Sample> Items
    {
        get
        {
            return _items;
        }

        set
        {
            _items = value;
            OnPropertyChanged();
        }
    }

然后你Xaml应该看起来像这样

 DataContext="{Binding RelativeSource={RelativeSource Self}}">

<Grid x:Name="LayoutRoot">
    <ListView ItemsSource="{Binding Items}"  x:Name="Lv">
        <ListView.View>
            <GridView >
                <GridView.Columns>
                    <GridViewColumn Header="Location"  DisplayMemberBinding="{Binding Location}"/>
                    <GridViewColumn Header="Name"  DisplayMemberBinding="{Binding Name}"/>
                </GridView.Columns>
            </GridView>
        </ListView.View>           
    </ListView>

</Grid>

将所有列中的ListView宽度除以:

<强>第一

定义一个转换器,使用ActualWidth的{​​{1}}来执行此操作:

ListView

并更新Xaml:

  public class ColumnDeviderConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return null;
        return int.Parse(value.ToString()) / 2;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

<强>第二

使用几个已经实现的类和行为之一,其中一个是ListView-Layout-Manager,将这些类添加到项目中,

enter image description here

然后更新Xaml以使用它们:

 DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
    <YourNameSpace:ColumnDeviderConverter x:Key="ColumnDeviderConverter"/>
</Window.Resources>

<Grid x:Name="LayoutRoot">
    <ListView ItemsSource="{Binding Items}"  x:Name="Lv">
        <ListView.View>
            <GridView >
                <GridView.Columns>
                    <GridViewColumn Header="Location" Width="{Binding ElementName=Lv,Path=ActualWidth,Converter={StaticResource ColumnDeviderConverter}}"  DisplayMemberBinding="{Binding Location}"/>
                    <GridViewColumn Header="Name" Width="{Binding ElementName=Lv,Path=ActualWidth,Converter={StaticResource ColumnDeviderConverter}}"  DisplayMemberBinding="{Binding Name}"/>
                </GridView.Columns>
            </GridView>
        </ListView.View>           
    </ListView>

</Grid>

两种解决方案的结果都是一样的:

enter image description here