我有一个包含3列的ListView控件:名称,姓氏和地址。我希望所有3列具有相同的宽度。我想出的唯一方法是将每列的宽度绑定到祖先的ActualWidth,并使用转换器将此宽度除以3,如下所示:
<GroupBox>
<ListView Name="People" ItemsSource="{Binding peopleList}">
<ListView.View>
<GridView >
<GridViewColumn Header="name" DisplayMemberBinding="{Binding Name}">
<GridViewColumn.Width>
<Binding Path="ActualWidth" Source="{RelativeSource Mode=FindAncestor, AncestorType={x:Type GroupBox}}" Converter ="{StaticResource ListViewConverter}"/>
</GridViewColumn.Width>
<GridViewColumn Header="surname" ...>
...
</GridViewColumn>
<GridViewColumn Header="address" ...>
...
</GridViewColumn>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</GroupBox>
转换类是:
class ListViewConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double state = (double)value;
return state / 3;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
但这不起作用。我认为GroupBox可能不是GridViewColumn.Width的祖先。 也许我弄错了,有一个更简单的方法来做到这一点?
答案 0 :(得分:3)
你是对的,GroupBox不是祖先 - 这是因为GridViewColumn没有添加到可视树中,因此依赖于可视树导航的绑定将不起作用。您可以将列绑定到静态资源:
要实现您的目标,需要相当多的自定义代码。请参阅MSDN论坛帖子:
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/83bd7ab9-3407-461f-a0bc-69e04870075c
此处的代码为指定列大小提供了更多选项:
http://www.codeproject.com/KB/grid/ListView_layout_manager.aspx