我想弄清楚如何在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
不允许您使用星号大小,因此我们最后回到我们开始的位置,其中列标题只是缩小以适应内容而不是占用所有可用空间。
有什么想法吗?
答案 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,将这些类添加到项目中,
然后更新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>
两种解决方案的结果都是一样的: