我希望将具有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
属性具有正常的数值。
所以主要的问题是:为什么绑定不起作用? (第二个问题是:如何正确实现所需的布局?)
答案 0 :(得分:1)
创建视图模型取决于所需的解决方案体系结构。例如,我将MSDN MVVM Pattern用于较大的项目,因为它允许更好的单元测试。在我看来,当你需要进行复杂的绑定并处理大量数据时,视图模型是一种更优雅的解决方案。