无法从ColumnDefinition.ActualWidth属性绑定

时间:2017-08-17 17:32:09

标签: c# wpf xaml layout data-binding

我希望将具有ListView作为ItemsPanel的WrapPanel中的视图模型项(来自源)对齐,以便项目基本上在两列中对齐,但是如果项目比一列,它包装,从而使其更高。

我希望通过Grid控件实现此目的,该控件的宽度与ListView具有两列相同,然后从ActualWidth获取(绑定)一个项目的宽度ColumnDefinition的{​​{1}}之一。

所以,我创建了以下XAML:

Grid

但是,这不起作用,项目在常规WrapPanel中对齐,而不是在列中。

原因为什么这不起作用:我检查了(在Live Property Explorer中)绑定<Grid> <Grid.ColumnDefinitions> <!--The column to bind from is a bit less wide than 50% to enable some margin between items in the same row.--> <ColumnDefinition x:Name="clm1" Width="45*"/> <ColumnDefinition Width="55*"/> </Grid.ColumnDefinitions> <ListView Grid.ColumnSpan="2" Width="some width" Height="some height" ItemsSource="some source"> <!--the wrap panel that wraps items after two is in a row--> <ListView.ItemsPanel> <ItemsPanelTemplate> <WrapPanel ItemWidth="{Binding ActualWidth, ElementName=clm1}" Orientation="Horizontal"/> </ItemsPanelTemplate> </ListView.ItemsPanel> <ListView.ItemTemplate> <DataTemplate> <!--some properties are binded to the view model object in the DataContext--> <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}"> <!--separate TextBlock is for text wrapping--> <TextBlock Text="{Binding Text}" TextWrapping="Wrap"/> </CheckBox> </DataTemplate> </ListView.ItemTemplate> </ListView> </Grid> 评估的值,它是{ {1}},尽管ActualWidth属性具有正常的数值。

所以主要的问题是:为什么绑定不起作用? (第二个问题是:如何正确实现所需的布局?)

1 个答案:

答案 0 :(得分:1)

创建视图模型取决于所需的解决方案体系结构。例如,我将MSDN MVVM Pattern用于较大的项目,因为它允许更好的单元测试。在我看来,当你需要进行复杂的绑定并处理大量数据时,视图模型是一种更优雅的解决方案。