WrapPanel宽度绑定

时间:2011-02-17 12:09:38

标签: wpf listview binding

如何将WrapPanel宽度绑定到ListView的第一列的宽度。两个控件都在用户控制之下。

1 个答案:

答案 0 :(得分:1)

对于GridViewColumn,您具有ActualWidth属性,该属性不是依赖属性,因此如果直接绑定到该属性,则在属性更改时将不会获​​得任何更新。然后你有Width属性,它是一个依赖属性,并且在大多数情况下会给你正确的值,但并不总是例如在自动调整大小时。结合这两个应该会给你想要的结果。也就是说,监听Width属性的变化并使用MultiBinding返回ActualWidth

<强>的Xaml

<WrapPanel ...>
    <WrapPanel.Width>
        <MultiBinding Converter="{StaticResource GridViewColumnWidthMultiConverter}">
            <Binding ElementName="listView" Path="View.Columns[0].Width"/>
            <Binding ElementName="listView" Path="View.Columns[0].ActualWidth"/>
        </MultiBinding>
    </WrapPanel.Width>
</WrapPanel>
<ListView Name="listView" ...>
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn .../>
                <GridViewColumn .../>
                <GridViewColumn .../>
                <!--...-->
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

GridViewColumnWidthMultiConverter

public class GridViewColumnWidthMultiConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double width = (double)values[0];
        double actualWidth = (double)values[1];
        return actualWidth;
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}