Как использовать относительную привязку Mode=FindAncestor

У меня есть элемент управления ListView, который имеет 3 столбца: имя, фамилия и адрес. Я хочу, чтобы все 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. Может быть, я все неправильно понял, и есть гораздо более простой способ сделать это?

1 ответ

Вы правы, 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

Другие вопросы по тегам