【发布时间】:2011-06-29 01:29:16
【问题描述】:
如何将 WrapPanel 宽度绑定到 ListView 第一列的宽度。这两个控件都在用户控制之下。
【问题讨论】:
如何将 WrapPanel 宽度绑定到 ListView 第一列的宽度。这两个控件都在用户控制之下。
【问题讨论】:
对于 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();
}
}
【讨论】: